您的位置:首页 > 其它

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是一个生成器,每次取下一个请求时,就会去找对应的变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐