簡體   English   中英

具有長start_urls列表的Scrapy Crawling URL的順序和來自spider的urls yiels

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

我的問題是:

  1. 下載器使用的網址順序? just_test1just_test2的請求just_test1僅在使用了所有start_urls之后由下載程序使用?(我已經做了一些測試,似乎答案是否定的)
  2. 什么決定訂單? 為什么以及如何訂購? 我們怎樣才能控制它?
  3. 這是處理已經在文件中的這么多網址的好方法嗎? 還有什么?

非常感謝你!!!

謝謝你的回答。但我仍然有點困惑: 默認情況下,Scrapy使用LIFO隊列來存儲待處理的請求。

  1. spiders的回調函數發出的requests將被提供給scheduler 。對start_url's requests執行相同start_url's requests嗎?spider start_requests()函數只生成迭代器而不提供實際請求。
  2. 所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM