寒假学习笔记06

  第六天打卡,今天继续上次的网页爬取的内容,上次分析了相关的参数内容,这次我在网上查找了相关的爬虫请求ajax的请求,完成数据的爬取。

  其中我才用的是scrapy 的爬虫模板来进行的爬取相关的网页,其中遇到了一些问题通过询问同学以及上网查询,最收取到了相关的信息。

  爬取源代码:

import json
import random
import string

import scrapy




class LetterSpider(scrapy.Spider):
    name = 'Letter'
    allowed_domains = ['www.beijing.gov.cn']
    # custome_setting可用于自定义每个spider的设置,而setting.py中的都是全局属性的,当你的
    # scrapy工程里有多个spider的时候这个custom_setting就显得很有用了
    custom_settings = {
        "DEFAULT_REQUEST_HEADERS": {
            'authority': 'www.beijing.gov.cn',
            # 请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。
            'accept': 'application/json, text/javascript, */*; q=0.01',
            # 指定客户端可接受的内容编码
            'accept-encoding': 'gzip, deflate',
            # 指定客户端可接受的语言类型
            'accept-language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'Content-Type': 'text/json',
            # 跨域的时候get,post都会显示origin,同域的时候get不显示origin,post显示origin,说明请求从哪发起,仅仅包括协议和域名
            'origin': 'http://www.beijing.gov.cn',
            # 表示这个请求是从哪个URL过来的,原始资源的URI
            'referer': 'http://www.beijing.gov.cn/hudong/hdjl/com.web.search.mailList.flow',
            # 设置请求头信息User-Agent来模拟浏览器
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
            'x-requested-with': 'XMLHttpRequest',
            # cookie也是报文属性,传输过去
            'cookie': 'HDJLJSID=39DBD6D5E12B9F0F8834E297FAFC973B; __jsluid_h=e6e550159f01ae9aceff30d191b09911; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216f9edc47471cb-0059c45dfa78d6-c383f64-1049088-16f9edc474895%22%7D; _gscu_564121711=80128103kc5dx617; X-LB=1.1.44.637df82f; _va_ref=%5B%22%22%2C%22%22%2C1580462724%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM-f5ankfbAnnYIH43aTQ0bvcFij9-hVxwm64pCc6rhCu5DYwg6xEVis-OVjqGinh%26wd%3D%26eqid%3Dd6b151bf000cfb36000000025e1c5d84%22%5D; _va_ses=*; route=74cee48a71a9ef78636a55b3fa493f67; _va_id=b24752d801da28d7.1578917255.10.1580462811.1580450943.',
            # 就是告诉服务器我参数内容的类型


        }
    }

    # 需要重写start_requests方法

    def start_requests(self):
        # 网页里ajax链接
        url = "http://www.beijing.gov.cn/hudong/hdjl/com.web.search.mailList.mailList.biz.ext"
        # 所有请求集合
        requests = []
        # 这里只模拟一页range(0, 1)
        for i in range(0, 33750,1000):

            random_random = random.random()
            # 封装post请求体参数
            my_data = {'PageCond/begin': i, 'PageCond/length': 1000, 'PageCond/isCount': 'true', 'keywords': '',
                       'orgids': '', 'startDate': '', 'endDate': '', 'letterType': '', 'letterStatue': ''}
            # 模拟ajax发送post请求
            request = scrapy.http.Request(url, method='POST',
                                     callback=self.parse_model,
                                     body=json.dumps(my_data),
                                     encoding='utf-8')
            requests.append(request)
        return requests

    def parse_model(self, response):
        # 可以利用json库解析返回来得数据,在此省略
        jsonBody = json.loads(response.body)
        # 拿到数据,再处理就简单了。不再赘述
        print(jsonBody)
        size = jsonBody['PageCond']['size']
        data = jsonBody['mailList']

        listdata = {}

        for i in range(size):
            print(i)
            listdata['letter_type'] = data[i]['letter_type']
            listdata['original_id'] = data[i]['original_id']
            listdata['catalog_id'] =str(data[i]['catalog_id'])
            listdata['letter_title'] = data[i]['letter_title']
            listdata['create_date'] = data[i]['create_date']
            listdata['org_id'] = data[i]['org_id']
            listdata['letter_status'] = data[i]['letter_status']
            listdata['isreply'] = data[i]['isReply']
            yield  listdata
            print(listdata)
源代码

这个代码还有一些地方没有看懂,只是尝试运行可以是实现,之后将研究下具体代码的作用,这个代码着实让我有点费劲。最后附一张我费了半天劲弄出来的三万多条数据。

原文地址:https://www.cnblogs.com/Evak/p/12270295.html