网址保密,只提供爬虫思路(实验学习所用,非商业用途)
1、发起首次请求,设置UA和cookie
2、翻页及formdata参数设置(注意这里的参数是以键值对的方式存在的)
3、首页数据的解析
4、详情页formdata的参数重构
5、档案页的数据解析
import scrapy
import json
from bosi.items import BosiItem
class BsSpider(scrapy.Spider):
name = 'bs'
# allowed_domains = ['xxxxxxxxx']
start_urls = ['http://xxxxxxxxxxxxxxxxxxxxxx']
#首次发起请求
def start_requests(self):
#翻页的url
url = "http:xxxxxxxxxxxxxx"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
"Cookie":"xxxxxxxxxxxxxxx; ASP.NET_SessionId=n1omhosmkcyjhyhba3meor0e; iflysse_client_sign=0f1d7195-8fca-4abd-b215-2dd2f15636e2; cacheHeader=%e9%bb%84%e5%a4%a9%e6%98%a5%3a1%3a%3a1; td_cookie=3746646333; SessionId=5bb2914e-d343-42b0-a49c-9a3779fde8a5"
}
for i in range(60):
#formdata必须以键值对的形式封装,所以翻页int类型要转为str类型
a=str(i*20)
formdata={
'sEcho':'1',
'iColumns':'6',
'sColumns':',,,,,',
'iDisplayStart':a,
'iDisplayLength':'20',
'mDataProp_0':'UserObject',
'bSortable_0':'false',
'mDataProp_1':'Name',
'bSortable_1':'false',
'mDataProp_2':'Email',
'bSortable_2':'false',
'mDataProp_3':'IDCard',
'bSortable_3':'false',
'mDataProp_4':'GenderStr',
'bSortable_4':'false',
'mDataProp_5':'5',
'bSortable_5':'false',
'iSortCol_0':'0',
'sSortDir_0':'asc',
'iSortingCols':'1',
'Action':'0',
'SelectStr':'',
'ClassType':'0',
'ClassID':'-1',
}
#FormRequest相当于是手动指定post。
yield scrapy.FormRequest(url,formdata=formdata,headers=headers, callback=self.parse)
def parse(self, response):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
"Cookie": "xxxxxxxxxxxxxxxx; ASP.NET_SessionId=n1omhosmkcyjhyhba3meor0e; iflysse_client_sign=0f1d7195-8fca-4abd-b215-2dd2f15636e2; cacheHeader=%e9%bb%84%e5%a4%a9%e6%98%a5%3a1%3a%3a1; td_cookie=3746646333; SessionId=5bb2914e-d343-42b0-a49c-9a3779fde8a5"
}
#页面数据是json格式,所以我们需要用json.loads
dict_data=json.loads(response.text)
for item1 in dict_data['aaData']:
item=BosiItem()
#学号
item["UserObject"]=item1["UserObject"]
#姓名
item["UserName"]=item1["UserName"]
#邮箱
item["Email"]=item1["Email"]
#身份证
item["IDCard"]=item1["IDCard"]
#性别
item["GenderStr"]=item1["GenderStr"]
#档案链接
item["ObjectID"]=item1["ObjectID"]
yield item
#档案页链接
url = "http://xxxxxxxxxxxxxxxxxxxx"
formdata1 = {
"Action": '2',
#档案页链接实际是一串加密内容,通过ajax加载详情页数据
"ID":item["ObjectID"]
} #meta:请求传参
yield scrapy.FormRequest(url, formdata=formdata1, headers=headers, callback=self.sun_parse, meta={"item": item})
def sun_parse(self,response):
dict_data2=json.loads(response.text)
for item2 in dict_data2["Data"]["CourseList"]:
item=response.meta["item"]
#课程名称
item["CourseName"]=item2["CourseName"]
#时间
item["DateStr"]=item2["DateStr"]
#学习时长
item["LearnTimeStr"]=item2["LearnTimeStr"]
#进度
item["ProgressStr"]=item2["ProgressStr"]
#正确率
item["CorrectRateStr"]=item2["CorrectRateStr"]
#编译次数
item["CompileNum"]=item2["CompileNum"]
print(item)
yield item