[英]the order of Scrapy Crawling URLs with long start_urls list and urls yiels from spider
救命! 阅读Scrapy
的源代码对我来说并不容易。 我有一个很长的start_urls
列表。 它在文件中约为3,000,000。 所以,我像这样制作start_urls
:
start_urls = read_urls_from_file(u"XXXX")
def read_urls_from_file(file_path):
with codecs.open(file_path, u"r", encoding=u"GB18030") as f:
for line in f:
try:
url = line.strip()
yield url
except:
print u"read line:%s from file failed!" % line
continue
print u"file read finish!"
MeanWhile,我的蜘蛛的回调函数是这样的:
def parse(self, response):
self.log("Visited %s" % response.url)
return Request(url=("http://www.baidu.com"), callback=self.just_test1)
def just_test1(self, response):
self.log("Visited %s" % response.url)
return Request(url=("http://www.163.com"), callback=self.just_test2)
def just_test2(self, response):
self.log("Visited %s" % response.url)
return []
我的问题是:
just_test1
, just_test2
的请求just_test1
仅在使用了所有start_urls
之后由下载程序使用?(我已经做了一些测试,似乎答案是否定的) 非常感谢你!!!
谢谢你的回答。但我仍然有点困惑: 默认情况下,Scrapy使用LIFO队列来存储待处理的请求。
requests
将被提供给scheduler
。对start_url's requests
执行相同start_url's requests
吗?spider start_requests()
函数只生成迭代器而不提供实际请求。 requests
(start_url和callback)是否都在同一个请求的队列中? Scrapy
中有多少个队列? 首先,请看这个主题 - 我想你会在那里找到所有的答案。
下载器使用的网址顺序? Just_test1,just_test2的请求是否仅在使用了所有start_urls之后由下载程序使用?(我已经做了一些测试,似乎答案是否定的)
你是对的,答案是No
。 行为是完全异步的:当蜘蛛启动时,调用start_requests
方法( 源 ):
def start_requests(self):
for url in self.start_urls:
yield self.make_requests_from_url(url)
def make_requests_from_url(self, url):
return Request(url, dont_filter=True)
什么决定订单? 为什么以及如何订购? 我们怎样才能控制它?
默认情况下,没有预定义的顺序 - 您无法知道make_requests_from_url
Requests
make_requests_from_url
到达 - 它是异步的。
请参阅此答案 ,了解如何控制订单。 简而言之,您可以覆盖start_requests
并使用priority
键标记已产生的Requests
(如yield Request(url, meta={'priority': 0})
)。 例如, priority
的值可以是找到url的行号。
这是处理已经在文件中的这么多网址的好方法吗? 还有什么?
我认为您应该直接在start_requests
方法中读取您的文件并生成URL:请参阅此答案 。
所以,你应该像这样做:
def start_requests(self):
with codecs.open(self.file_path, u"r", encoding=u"GB18030") as f:
for index, line in enumerate(f):
try:
url = line.strip()
yield Request(url, meta={'priority': index})
except:
continue
希望有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.