Scrapy 发起post请求

173 阅读2分钟

网址保密,只提供爬虫思路(实验学习所用,非商业用途)

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