2017-02-28 66 views
1

我目前正在嘗試創建一個使用scrapy的小型web報廢原型。 我目前的問題與鏈接提取和跟隨有關。Scrapy深入爬行不起作用

我試圖讓scrapy探索頁面並找到頁面的鏈接(現在不是圖像和其他內容),但我不知道如何正確參數。

這是我使用的蜘蛛:似乎沒有找到頁面中的任何鏈接

class DefaultSpider(CrawlSpider): 

    name = "default" 
    session_id = -1 
    rules = [Rule(LinkExtractor(allow=()),callback='parse', follow=True)] 

def start_requests(self): 
    #not relevent code that gives an URL list to be scrawled 
    for url in listurl: 

    #make scrappy follow only the current domain url. 
    self.rules[0].allow=url 
     yield scrapy.Request(url=url, callback=self.parse) 

def parse(self, response): 
    page = Website(response.url,response.text) 
    DBInterface.store(page) 

蜘蛛。我想我沒有按照正確的方式去做。我試圖將另一個函數作爲回調而不是解析方法。 (改變規則回調參數太)

def processlinks (self,response) 
    page = Website(response.url,response.text) 
    DBInterface.store(page) 

編輯:更新代碼+正確認識冠軍。

回答

0

CrawlSpider是一種特殊的蜘蛛,增加了rules支持跟隨鏈接(不BTW提取它們) 。

對於這種蜘蛛的工作,你can't overridestart_requestsparse方法

關於取得聯繫,我會建議使用LinkExtractor這使得抽取清潔:

從scrapy

def find_links(self, response): 
    for link in LinkExtractor().extract_links(response): 
     logging.info('Extracting new url' + link.url) 
     yield scrapy.Request(link.url, callback=self.insert_linkDB) 

更多和更新信息LinkExtractor可用in the documentation

+0

我理解你的主張,但我想你是誤會了我的意思,我適當編輯的標題和我的代碼,以使其更清晰。我想做一個深入的感謝! – Neil

+1

也許你沒有讀過我的答案的第一部分,但是當使用'CrawlSpider'時,你不能重寫'start_requests'和'parse'方法。我一直在你的代碼中看到這些,所以這可能是你的蜘蛛不工作的原因。 – eLRuLL

+0

「我試圖將另一個函數作爲回調而不是解析方法(更改規則回調參數)」我引用。如果我重寫解析或使用另一個方法作爲回調,它的行爲方式相同。 – Neil

0

使CrawlSpider處理初始URL的方式與隨後使用LinkExtractor進行提取的方式相同,這在這裏是您想要的,這有點棘手。問題在於不應該爲您手動啓動的任何請求定義自定義回調,因爲它會阻止LinkExtractor的工作。另一方面,您希望爲每個抓取的網址執行一些操作,包括初始網址。對於使用LinkExtractor提取的這些URL,可以在定義規則時提供回調,但對於未使用這些規則提取的初始URL,這顯然不起作用。爲此,Scrapy提供了另一種方法parse_start_url(response),您可以並且應該覆蓋。所以你的情況,下面會做你想要什麼:

class DefaultSpider(CrawlSpider): 

    name = "default" 
    session_id = -1 
    rules = [Rule(LinkExtractor(allow=()),callback='parse_results', follow=True)] 

def start_requests(self): 
    #not relevent code that gives an URL list to be scrawled 
    for url in listurl: 

    #make scrappy follow only the current domain url. 
    self.rules[0].allow=url 
     yield scrapy.Request(url=url) 

def parse_start_url(self, response): 
    self.parse_results(response) 

def parse_results(self, response): 
    page = Website(response.url,response.text) 
    DBInterface.store(page)