[英]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.