scrapy爬虫注意点(2)—— 根据page循环遍历页面参数问题

来源:互联网 发布:苹果狙击镜软件 编辑:程序博客网 时间:2024/06/06 22:45

1. 问题背景

  • 在访问如下这种论坛网页时,经常会根据页码访问接下来的页面。很多时候,会将pageIdx带入带request中的meta中,以便将这个page数据传递下去,但是基于scrapy的yield机制,不同的写法,会让带进去的page不同。
    这里写图片描述

2. 实例分析

  • 代码
# -*- coding: utf-8 -*-import scrapyclass MyclawerSpider(scrapy.Spider):    name = 'myClawer'    allowed_domains = ['bbs.fengniao.com']    start_urls = ['http://bbs.fengniao.com/']    def start_requests(self):        # 全局变量        pageDict = {'page': 99}        pageGlobal = 99        # 关注 pageIdx    循环内的变量        for pageIdx in range(1,10):            # 关注 pageDict   循环外的变量,相对于循环来说,是全局变量(可变)            pageDict['page'] = pageIdx            # 关注 pageGlobal   循环外的变量,相对于循环来说,是全局变量(不可变)            pageGlobal = pageIdx            # 关注 pageTemp   循环外的变量,相对于循环来说,是局部变量,每轮都会创建一个单独的变量            pageTemp = pageIdx            yield scrapy.Request(                url=f'http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page={pageIdx}',                meta={'pageIdx': pageIdx, 'pageTemp': pageTemp, 'pageGlobal': pageGlobal, 'pageDict': pageDict, 'dont_redirect': True},                callback=self.parse,                errback=self.error            )    def parse(self, response):        print(f"parse url={response.url}, status={response.status}, meta={response.meta}")    def error(self, response):        pass
  • 输出结果:
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=1, status=200, meta={'pageIdx': 1, 'pageTemp': 1, 'pageGlobal': 1, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.254000186920166}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=4, status=200, meta={'pageIdx': 4, 'pageTemp': 4, 'pageGlobal': 4, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2779998779296875}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=6, status=200, meta={'pageIdx': 6, 'pageTemp': 6, 'pageGlobal': 6, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2890002727508545}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=7, status=200, meta={'pageIdx': 7, 'pageTemp': 7, 'pageGlobal': 7, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.30900001525878906}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=2, status=200, meta={'pageIdx': 2, 'pageTemp': 2, 'pageGlobal': 2, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3300001621246338}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=8, status=200, meta={'pageIdx': 8, 'pageTemp': 8, 'pageGlobal': 8, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3259999752044678}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=5, status=200, meta={'pageIdx': 5, 'pageTemp': 5, 'pageGlobal': 5, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3320000171661377}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=3, status=200, meta={'pageIdx': 3, 'pageTemp': 3, 'pageGlobal': 3, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3320000171661377}parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=9, status=200, meta={'pageIdx': 9, 'pageTemp': 9, 'pageGlobal': 9, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2590000629425049}
  • 分析区别:
    这里写图片描述
  • 从上面的结果可以看出:
    • 全局变量(可变):page = 9 记录的是循环最后的一个值。
    • 全部变量(不可变):page = 1,2…….9,每一轮的赋值,其实事实上是产生了一个新的变量。
    • 局部变量:page = 1,2…….9,每一轮的赋值,产生了一个新的变量.
  • 原因就在于yield是一个生成器,每次取下一个请求时,就会去找对应的变量。
阅读全文
0 0