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
- scrapy爬虫注意点(2)—— 根据page循环遍历页面参数问题
- scrapy爬虫注意点(1)—— scrapy.FormRequest中formdata参数
- 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)
- Scrapy定向爬虫教程(三)——爬取多个页面
- Scrapy定向爬虫教程(三)——爬取多个页面
- scrapy专利爬虫(一)——scrapy简单介绍
- 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(1)
- Scrapy爬虫(三)——简易动态网页爬虫
- 网络爬虫系列笔记(4)——Scrapy爬虫
- Scrapy爬虫(一)——你的第一个Scrapy爬虫
- Python 爬虫 —— scrapy
- 爬虫——Scrapy框架
- scrapy爬虫精要(2)
- scrapy爬虫运行问题
- 根据返回json动态拼接页面(注意点+转意字符)
- scrapy框架图片下载注意点
- 循环神经网络训练时几个参数注意点的笔记
- scrapy专利爬虫(二)——请求相关
- mysql查询上月记录数
- Codeforces Round #443 (Div. 2) C. Short Program
- neon优化二维卷积算法
- JAVA运算符优先级概念
- 多任务学习“Exploiting Multi-Grain Ranking Constraints for Precisely Searching Visually-similar Vehicles”
- scrapy爬虫注意点(2)—— 根据page循环遍历页面参数问题
- unity5 GI全局光照 问题集锦解答
- 曹可爱之最可爱-Vue.js入门(三)模版语法
- 如何给bigdecimal保留小数位
- C#中关闭第一个Form窗口,打开另一个新窗口方法
- Java学习笔记(2)
- 阿里云ECS服务器CentOS7.2安装Python2.7.13
- Skyline 二次开发鼠标获取三维坐标
- 模块API之__module_address