亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有很長的start_urls列表和來自蜘蛛的url yels的Scrapy Crawling

具有很長的start_urls列表和來自蜘蛛的url yels的Scrapy Crawling

素胚勾勒不出你 2021-03-12 14:09:11
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!"意思是,我的蜘蛛的回調函數是這樣的:  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 []我的問題是:下載器使用的URL的順序?會提出的要求 just_test1,just_test2 通過下載器只有所有后方可使用 start_urls,使用?(我做了一些測試,似乎答案是沒有)決定訂單的是什么?為什么和如何執行此命令?我們如何控制它?這是處理文件中已包含許多URL的好方法嗎?還有什么?非常感謝你?。?!感謝您的回答。但是我還是有些困惑: 默認情況下,Scrapy使用LIFO隊列存儲未決請求。requestsSpider的回調函數的made將提供給scheduler.spider函數 做同樣的事情start_url's requests?spider start_requests()函數僅生成一個迭代器,而沒有給出真正的請求。全部requests(start_url和回調的)都在同一個請求的隊列中嗎?有多少個隊列Scrapy?
查看完整描述

2 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

首先,請參閱此主題-我想您會在這里找到所有答案。

下載器使用的URL的順序?僅在使用所有start_url之后,下載程序才會使用just_test1,just_test2發出的請求嗎?(我進行了一些測試,答案似乎是否定的)

您說得對,答案是No。該行為是完全異步的:啟動蜘蛛程序后,start_requests將調用(source)方法:

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)

決定訂單的是什么?為什么和如何執行此命令?我們如何控制它?

默認情況下,沒有預先定義的順序-你可以不知道什么時候Requestsmake_requests_from_url抵達的-它是異步的。

有關如何控制訂單的信息,請參見此答案。長話短說,您可以使用鍵覆蓋start_requests并標記“ yield” (如)。例如,的值可以是找到該網址的行號。Requestspriorityyield Request(url, meta={'priority': 0})priority

這是處理文件中已包含許多URL的好方法嗎?還有什么?

我認為您應該直接在start_requestsmethod中讀取文件并產生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


查看完整回答
反對 回復 2021-03-29
  • 2 回答
  • 0 關注
  • 304 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號