寒假学习笔记16

  今天询问同学,找了一下热词的相关内容,也和同学的热词的网站一样是百度百科的一个分类,百度百科也是使用的post传值来传输的内容,但是他每次传输的数量可能有限当我每次传输1000条时发现经常报错,之后我就更改了爬取条数100跳可以爬取了,一共爬取了一万多条数据,也不枉我捣鼓了一天。

这是我爬取的代码(同学给我讲解的以及我自己的内容):

import json
import string

import scrapy


class WordSpider(scrapy.Spider):
    name = 'reci'
    allowed_domains = ['baike.baidu.com']
    # custome_setting可用于自定义每个spider的设置,而setting.py中的都是全局属性的,当你的
    # scrapy工程里有多个spider的时候这个custom_setting就显得很有用了
    custom_settings = {
        "DEFAULT_REQUEST_HEADERS": {
            'authority': 'baike.baidu.com',
            # 请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。
            'accept': 'application/json, text/javascript, */*; q=0.01',
            # 指定客户端可接受的内容编码
            'accept-encoding': 'gzip, deflate, br',
            # 指定客户端可接受的语言类型
            'accept-language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Content - Length': '200',
            # 跨域的时候get,post都会显示origin,同域的时候get不显示origin,post显示origin,说明请求从哪发起,仅仅包括协议和域名
            'origin': 'http://baike.baidu.com',
            # 表示这个请求是从哪个URL过来的,原始资源的URI
            'referer': 'http://baike.baidu.com/wikitag/taglist?tagId=76607',
            # 设置请求头信息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': 'BIDUPSID=374B0B97932138402979026442704DFC; PSTM=1563937805; '
                      'BAIDUID=A9C6FBA10593FC60D42D1EE950683FBE:FG=1; '
                      'Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1581650018; '
                      'Hm_lpvt_55b574651fcae74b0a9f1cf9c8d7c93a=1581650018; delPer=0; '
                      'H_PS_PSSID=30745_1445_21080_26350_30494; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; PSINO=2 ',
            # 就是告诉服务器我参数内容的类型
            'Sec - Fetch - Mode': 'cors',
            'Sec - Fetch - Site': 'same - origin'
        }
    }

    # 需要重写start_requests方法

    def start_requests(self):
        # 网页里ajax链接
        url = "http://baike.baidu.com/wikitag/api/getlemmas"
        # 所有请求集合
        requests = []
        # 这里只模拟一页range(0, 1)
        for i in range(0, 19700,100):
            # 15967
            random_random = random.random()
            # 封装post请求体参数
            my_data="limit=100&timeout=3000&filterTags=[]&tagId=76607&fromLemma=false&page="+str(i/100)
            #my_data = {'limit': '24', 'timeout': '3000', 'filterTags': [], 'tagId': '76607', 'fromLemma': 'false',
            #           'contentLength': '40', 'page': str(i)}
            # my_data = {'PageCond/begin': i, 'PageCond/length': 1000, 'PageCond/isCount': 'true', 'keywords': '',
            #          'orgids': '', 'startDate': '', 'endDate': '', 'letterType': '', 'letterStatue': ''}
            # 模拟ajax发送post请求
            print(my_data)
            request = scrapy.Request(url, method='POST',
                                     callback=self.parse_model,
                                     body=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['lemmaList']

        listdata = {}

        for i in range(100):
            print(i)
            listdata['lemmaId'] = data[i]['lemmaId']
            listdata['lemmaTitle'] = data[i]['lemmaTitle']
            listdata['lemmaUrl'] = data[i]['lemmaUrl']
            yield listdata
            print(listdata)

WordSpider

最终的结果:

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