2013-12-15 39 views
6

我發現的所有關於Scrapy的例子都討論瞭如何抓取單個頁面,具有相同url模式的頁面或網站的所有頁面。 我需要抓取一系列頁面A,B,C其中,在你得到了鏈接到B等.. 例如網站結構是:如何使用scrapy抓取多個頁面?

A 
----> B 
---------> C 
D 
E 

我需要抓取所有的C頁面,但要獲得鏈接到C我需要爬行之前A和B 任何提示?

+1

我不使用scrapy,但是[文檔](http://doc.scrapy.org/en/latest/intro/tutorial.html)非常廣泛,並且包含足夠的信息來幫助您完成此操作。看起來你需要編寫一個[鏈接提取器](http://doc.scrapy.org/en/latest/topics/link-extractors.html),它從A頁面獲取頁面「B」鏈接,然後解析'B'頁面可以找到'C'頁面的網址。嘗試這樣做,然後用代碼發佈具體問題,如果你有問題。 – ChrisP

+4

很抱歉,對於初學者來說,文檔確實非常糟糕。有幾個而沒用的例子,你回頭看文檔網站並沒有幫助任何人。 – not2qubit

回答

10

看到scrapy Request structure,抓取例如鏈,你將不得不使用回調參數如下所示:

class MySpider(BaseSpider): 
    ... 
    # spider starts here 
    def parse(self, response): 
     ... 
     # A, D, E are done in parallel, A -> B -> C are done serially 
     yield Request(url=<A url>, 
         ... 
         callback=parseA) 
     yield Request(url=<D url>, 
         ... 
         callback=parseD) 
     yield Request(url=<E url>, 
         ... 
         callback=parseE) 

    def parseA(self, response): 
     ... 
     yield Request(url=<B url>, 
         ... 
         callback=parseB) 

    def parseB(self, response): 
     ... 
     yield Request(url=<C url>, 
         ... 
         callback=parseC) 

    def parseC(self, response): 
     ... 

    def parseD(self, response): 
     ... 

    def parseE(self, response): 
     ... 
+0

它顯示請求未定義。我需要導入什麼來使這個代碼工作?謝謝。 –

+0

嘗試'從scrapy.http導入請求' –

6

下面是一個例子蜘蛛,我寫我的一個項目:

from scrapy.contrib.spiders import CrawlSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import Request 
from yoMamaSpider.items import JokeItem 
from yoMamaSpider.striputils import stripcats, stripjokes 
import re 

class Jokes4UsSpider(CrawlSpider): 
    name = 'jokes4us' 
    allowed_domains = ['jokes4us.com'] 
    start_urls = ["http://www.jokes4us.com/yomamajokes/"] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select('//a') 
     for link in links: 
      url = ''.join(link.select('./@href').extract()) 
      relevant_urls = re.compile(
       'http://www\.jokes4us\.com/yomamajokes/yomamas([a-zA-Z]+)') 
      if relevant_urls.match(url): 
       yield Request(url, callback=self.parse_page) 

    def parse_page(self, response): 
     hxs = HtmlXPathSelector(response) 
     categories = stripcats(hxs.select('//title/text()').extract()) 
     joke_area = hxs.select('//p/text()').extract() 
     for joke in joke_area: 
      joke = stripjokes(joke) 
      if len(joke) > 15: 
       yield JokeItem(joke=joke, categories=categories) 

我認爲解析方法就是你所追求的: 它查看start_urls頁面上的每一個鏈接,然後使用一些正則表達式來決定它是否是一個relevant_url(即我想刮的url),如果它是相關的 - 它使用yield Request( url,callback = self.parse_page),它調用parse_page方法。

這是你之後的事情嗎?