Python 制造刮痧,请求鉴定?
这对我来说不是问题,没有它我可以生活,但我只是好奇它是否可能以及如何实现 今天我了解到,Python 制造刮痧,请求鉴定?,python,python-2.7,web-scraping,scrapy,scrapy-spider,Python,Python 2.7,Web Scraping,Scrapy,Scrapy Spider,这对我来说不是问题,没有它我可以生活,但我只是好奇它是否可能以及如何实现 今天我了解到,scrapy.Request的完成顺序与启动顺序不同 伪代码示例: class SomeSpider(scrapy.Spider): def parse(self, response): # get all ads(25) from ads list for ad in adList(): add_url = findAddUrl()
scrapy.Request
的完成顺序与启动顺序不同
伪代码示例:
class SomeSpider(scrapy.Spider):
def parse(self, response):
# get all ads(25) from ads list
for ad in adList():
add_url = findAddUrl()
yield scrapy.Request(add_url, callback=self.parseAd)
# go to next page
if some_condition_OK:
next_page_url = findNextpageUrl()
yield scrapy.Request(next_page_url)
else:
print 'Stoped at.'
def parseAd(self, response):
field_1 = get_field_1()
field_n = get_field_n()
# save field_1 to field_n to sqlite DB
这是我编写的一个简化的spider示例,它运行良好
但我今天学到的是,产生scrapy.Request
不会按照开始的顺序完成
在我的示例中,在每个页面上,每个页面有25个广告,我开始生成scrapy.Request(add_url,callback=self.parseAd)
以从每个广告中获取更多信息。然后,我使用
进入下一页并生成scrapy.Request(下一页\u url)
但我注意到,第2页的一些广告将在第1页的所有广告之前完成。
我理解为什么,也看到了这种方法的好处 但我的问题是,是否有可能使
请求变得不确定
我所说的确定性是指每个scrapy.Request
将以与启动相同的顺序完成。添加以下设置:
DOWNLOAD_DELAY
Default: 0
下载延迟=0.25延迟250毫秒
但是scrapy也有一个自动设置下载延迟的功能,称为AutoThrottle。它会根据Scrapy服务器和正在爬行的网站的负载自动设置延迟。这比设置任意延迟更有效。使Scrapy具有确定性的唯一方法是同时只产生一个请求,而将其余请求保留在列表或队列中:
class SomeSpider(scrapy.Spider):
pending_request = []
def parse(self, response):
# get all ads(25) from ads list
for ad in adList():
add_url = findAddUrl()
self.pending_request.append(
scrapy.Request(add_url, callback=self.parseAd))
# go to next page
if some_condition_OK:
next_page_url = findNextpageUrl()
self.pending_request.append(scrapy.Request(next_page_url))
else:
print 'Stoped at.'
if self.pending_request:
yield self.pending_request.pop(0)
def parseAd(self, response):
field_1 = get_field_1()
field_n = get_field_n()
if self.pending_request:
yield self.pending_request.pop(0)
我使用下载延迟=1
和并发请求=1
。它仍然不是确定性的。请尝试自动跳转下载\u延迟
,并且自动跳转
与确定性顺序无关。