2016-08-15 41 views
4

下面是一個簡單scrapy蜘蛛如何在scrapy.Request中添加dont_filter = True參數使我的解析方法起作用?

import scrapy 

class ExampleSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["https://www.dmoz.org"] 
    start_urls = ('https://www.dmoz.org/') 

    def parse(self,response): 
     yield scrapy.Request(self.start_urls[0],callback=self.parse2) 

    def parse2(self, response): 
     print(response.url) 

當你運行該程序,parse2方法不起作用,它不打印response.url。然後我在下面的線程中找到了這個解決方案。

Why is my second request not getting called in the parse method of my scrapy spider

它只是我需要添加dont_filter =真在請求方法的參數,使parse2功能工作。

yield scrapy.Request(self.start_urls[0],callback=self.parse2,dont_filter=True) 

但在scrapy文檔和很多在YouTube上的教程中給出的例子,他們從來沒有使用過dont_filter = True參數在scrapy.Request方法仍然是他們的第二解析功能的工作原理。

看看這個

def parse_page1(self, response): 
    return scrapy.Request("http://www.example.com/some_page.html", 
         callback=self.parse_page2) 

def parse_page2(self, response): 
    # this would log http://www.example.com/some_page.html 
    self.logger.info("Visited %s", response.url) 

爲什麼不能我的蜘蛛的工作,除非dont_filter =真被添加?我究竟做錯了什麼 ?我的蜘蛛在第一個例子中過濾的重複鏈接是什麼?

P.S.我可以在我上面發佈的QA線程中解決這個問題,但是我不允許發表評論,除非我有50個聲望(可憐我!!)

+0

你有兩次下載同一頁面的原因嗎?Scrapy會過濾您的請求,因此您不會最終抓取相同的頁面,'dont_filter'完全意味着忽略此過濾器。 – Granitosaurus

+0

與你的問題沒有關係,但可能很快就會咬你:'allowed_domains'應該列出域名,而不是URL,所以它應該是'allowed_domains = [「dmoz.org」]' –

回答

6

簡短回答:您正在進行重複請求。 Scrapy內置了默認打開的重複篩選。這就是爲什麼parse2沒有被調用。當您添加dont_filter=True時,scrapy不會過濾出重複的請求。所以這次請求被處理。

較長版本:

在Scrapy,如果已經設置start_urls或具有方法start_requests()定義,蜘蛛自動請求這些網址並傳遞給parse方法,該方法是用於解析的默認方法的響應要求。現在你可以從這裏產生新的請求,這將再次被Scrapy解析。如果您未設置回撥,parse方法將再次使用。如果您設置回調,則會使用該回調。

Scrapy還具有內置的過濾器,可以阻止重複的請求。這就是說,如果Scrapy已經抓取一個網站並解析了響應,即使您通過該網址發出另一個請求,scrapy也不會處理它。

就你而言,你的網址爲start_urls。 Scrapy從該網址開始。它抓取該網站並將響應傳遞給parse。在parse方法的內部,您再次向相同的網址(剛剛處理的scrapy)發出請求,但這次是parse2作爲回調。當這個請求被取消時,scrapy認爲這是重複的。所以它忽略了請求並且從不處理它。所以沒有撥打電話parse2

如果要控制哪些URL應該被處理且回調使用,我建議你重寫start_requests()並返回,而不是使用單start_urls屬性scrapy.Request列表。

+0

我想你的意思是重寫'start_requests', get_start_urls'不是你最後一段中的東西。 – Granitosaurus

+0

我的不好,是的,我正在更新答案。我從記憶中寫下,忘了名字。 – masnun

+0

我從未想過'start_urls'中的網址會被自動解析。非常感謝您的幫助和時間 –

相關問題