2013-12-15 53 views
6

Scrapyで見つかったすべての例では、1つのページをクロールする方法、同じURLスキーマを持つページ、またはウェブサイトのすべてのページについて話しています。私は、すべてのCのページをクロールする必要がscrapyを使用して複数のページをクロールするにはどうすればよいですか?

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

: 私はAであなたがBへのリンクを持って、その..に は、例えば、ウェブサイトの構造があるページA、B、Cのシリーズをクロールする必要があります、Cへのリンクを取得するには、AとBの前にクロールする必要があります。 ヒント?

+1

私は治療法を使用していませんが、[ドキュメント](http://doc.scrapy.org/en/latest/intro/tutorial.html)は広範で、これを達成するための十分な情報が含まれています。 'A'ページから' B'リンクを取得してから解析する[link extractor](http://doc.scrapy.org/en/latest/topics/link-extractors.html)を書く必要があるようです'B'ページで' C'のページURLを探します。それをやってみて、問題があればコードで特定の質問を投稿してください。 – 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

try 'from scrapy.http import Request' –

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メソッドを呼び出します。

これはあなたが後にするものですか?

関連する問題