scrapy爬虫注意点(2)—— 根据page循环遍历页面参数问题
2017-10-27 17:02
501 查看
1. 问题背景
在访问如下这种论坛网页时,经常会根据页码访问接下来的页面。很多时候,会将pageIdx带入带request中的meta中,以便将这个page数据传递下去,但是基于scrapy的yield机制,不同的写法,会让带进去的page不同。2. 实例分析
代码# -*- coding: utf-8 -*- import scrapy class 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是一个生成器,每次取下一个请求时,就会去找对应的变量。
相关文章推荐
- (待补全测试结果)crm小问题注意:add.jsp添加客户页面回显字典供选择。【查询字典时传参数typeCode不能和属性名相同】
- scrapy爬虫注意点(1)—— scrapy.FormRequest中formdata参数
- ######保存角色,add表单页面Ajax传参给action,多个集合属性,【较为复杂的页面传参(封装ajax json参数)】:注意表单数据序列化,jquery遍历,json对象转String
- 使用增强for循环实现遍历的注意问题
- 在JBOSS Seam的page.xml中传递参数到页面的问题
- 根据url 参数,页面显示不同背景图片
- AutoCompleteExtender需要注意的问题(参数类型,参数名称,返回值类型)
- h5页面嵌入微信进行分享功能注意问题
- foreach 是传入参数是 Set<Long[]>时,数据循环都是同样数据的问题
- asp.net页面通过URL参数传值中文乱码问题解决办法
- [项目bug收集整理3]get页面,post页面的url 参数预防问题
- DIV+CSS页面布局中注意的问题以及常用的CSS使用方法
- [读书笔记]python爬虫-scrapy安装过程常见问题及解决方法
- 使用MVC框架中要注意的问题(五):如何在页面和用户控件之间传递数据
- vue刷新页面带的参数丢失问题
- Python抓取框架Scrapy爬虫入门:页面提取
- js关于循环中onclick绑定带参数的函数问题
- 利用游标先遍历表数据,再根据循环插入数据
- 页面get请求 中文参数方法乱码问题
- 解决在aspx页面上进行传中文参数时会出现乱码问题