2014-10-29 66 views
2

我正在嘗試使用scrapy抓取整個網站。按照scarpy的文檔Scrapy不會抓取起始網址中包含的數據

start_urls - spider將開始抓取的URL列表, 未指定特定URL時。所以,下載的第一頁 將在這裏列出。隨後網址將會從包含在開始的URL數據生成 先後。

所以根據這個定義,scrapy應該蜘蛛通過start_urls下提到的頁面上的所有子url,但它只抓取我指定的url。我確實指定了Scrapy - Crawl whole website中提到的規則,但它沒有幫助。它只會抓取並輸出我在start_urls中指定的頁面。

這裏是我的代碼片段:

class AcdivocaFirstSpider(scrapy.Spider): 
    name = "example_sample" 
    allowed_domains = ["example.org"] 
    start_urls = ["http://www.example.org/site/id/home"] 
    rules = rules = [Rule(SgmlLinkExtractor(), callback='parse_item', follow=True)] 

    def parse(self, response): 
     filename = response.url.split("/")[-1] #so eg it would name 'home' 
     open(filename, 'wb').write(response.body) 

這就產生了與「家」網頁提取HTML數據的單個文件。如何從主頁開始以遞歸方式抓取整個網站?

任何幫助表示讚賞。謝謝。

回答

2

兩件事情改變:

  • 使用規則,使AcdivocaFirstSpider包含在開始的scrapy.contrib.spiders.CrawlSpider一個子類,而不是scrapy.Spider

隨後的網址將被從數據連續發生網址。

這句話有誤導性。 scrapy.Spider本身並不做任何特殊那些開頭的URL:它下載它們,然後將響應的身體parse()。如果parse()回調實現,以產生進一步的請求,那麼,隨後的網址將被從數據從這些網址產生的,但是這不是自動/自動魔法。

  • 使用scrapy.contrib.spiders.CrawlSpider時,你需要覆蓋內置parse()方法,這其中的規則進行檢查,並生成頁面的請求。所以,你需要重命名parseparse_item(如在規則中引用)

the warning in the docs on crawling rules.

+0

這幫助!非常感謝你,我最終沒有重寫默認的解析方法,而是將其中一個定義爲要使用的回調函數! – user988544 2014-10-30 15:43:57