2012-07-31 71 views
1

我想根據索引頁上的數據或信息來編寫抓取某些頁面的蜘蛛。然後將結果存儲在數據庫中。如何基於索引頁上的信息來抓取網頁

例如,讓說,我想爬stackoverflow.com/questions/tagged/scrapy 我會去通過索引頁面,如果這個問題是不是在我的數據庫,那麼我會保存回答次數在數據庫,然後按照問題的鏈接並抓取該頁面。

如果問題已經存在於數據庫中,但答案數大於數據庫中的問題:再次抓取該頁。

如果問題已經在數據庫中並且答案計數器是相同的:請跳過此問題。

目前我可以在索引頁面上獲得所有鏈接和答案數(在本例中)。 但我不知道如何讓蜘蛛跟隨回答計數問題頁面的鏈接。

有沒有辦法用一個蜘蛛,而不是有兩個蜘蛛要做到這一點,一個蜘蛛越來越索引頁上的所有環節,與數據庫中的數據進行比較,輸出一個JSON或CSV文件,然後將其傳遞到另一個蜘蛛爬行問題頁面?

回答

0

只需使用BaseSpider即可。這樣,你可以使所有的邏輯取決於你正在抓取的內容。我個人更喜歡BaseSpider,因爲它可以讓你更好地控制抓取過程。

蜘蛛應該是這個樣子(這更多的是一種僞代碼):

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from myproject.items import MyItem 

class StackOverflow(BaseSpider): 
    name = 'stackoverflow.com' 
    allowed_domains = ['stackoverflow.com'] 
    start_urls = ['http://stackoverflow.com/questions'] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     for question in hxs.select('//question-xpath'): 
      question_url = question.select('./question-url') 
      answer_count = question.select('./answer-count-xpath') 
      # you'll have to write the xpaths and db logic yourself 
      if get_db_answer_count(question_url) != answer_count[0]: 
       yield Request(question_url, callback = self.parse_question) 

    def parse_question(self, response): 
     insert_question_and_answers_into_db 
     pass 
+0

當蜘蛛運行時,我可以動態地在start_urls列表中添加URL嗎?在你的例子中,蜘蛛開始抓取第一個問題頁面,但它不會繼續到第二個頁面。我可以在第一頁上添加第二頁到start_urls基礎上嗎?例如,如果第一頁的最後一個問題不在我的數據庫中,這意味着第二頁上可能會有更多新問題,這些問題我還沒有涉及。所以我應該去第二頁查看。我能以某種方式在蜘蛛運行時將新網址附加到start_urls上嗎? – user1499532 2012-10-06 17:20:36

0

這是CrawlSpider和規則所做的事情(請務必查看示例)。您可以首先從索引網站獲取信息(儘管您的方法會計算答案在某種程度上存在缺陷:如果用戶刪除了帖子並添加了新帖子會如何)並決定每個子頁面,如果您想獲取其信息或不。

把簡單:在索引頁上使用蜘蛛,並按照其問題。當提出問題時,請檢查您是否想獲取信息或drop/ignore the question

+0

感謝。計算答案的數量只是一個例子。但我想將答案數(在本例中)存儲在數據庫中的刮取數據旁邊。我使用規則的問題是它只檢查鏈接模式。我正在嘗試構建一個蜘蛛,它將遵循鏈接庫中索引頁上某些數據的基礎。要繼續我的stackoverflow示例,如果該問題被user1499532詢問,那麼請遵循link和else:drop/ignore。 – user1499532 2012-08-02 17:42:43

+0

這不能通過規則來完成,而是通過Scrapy的其他技術完成。您可以創建一個接收網站(答案)的管道,並決定是否會處理該網站。另一種方法是在創建項目之前檢查它。蜘蛛本身無法決定這一點,但它可用的機制之一。 – DrColossos 2012-08-03 06:35:26