2012-12-28 13 views
9

Scrapyを使用してサイトを反復処理するにはどうすればよいですか? http://www.saylor.org/site/syllabus.php?cid=NUMBERに一致するすべてのサイトの本文を抽出したいと思います。ここでNUMBERは1〜400ほどです。Python Scrapyでサイト全体を反復する

私はこのクモ書いた:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from syllabi.items import SyllabiItem 

class SyllabiSpider(CrawlSpider): 

    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    start_urls = ['http://www.saylor.org/site/syllabus.php?cid='] 
    rules = [Rule(SgmlLinkExtractor(allow=['\d+']), 'parse_syllabi')] 

    def parse_syllabi(self, response): 
     x = HtmlXPathSelector(response) 

     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = x.select("/html/body/text()").extract() 
     return syllabi 

をしかし、それは動作しません。そのstart_urlのリンクを探していることを理解していますが、これは実際にやりたいことではありません。私はサイトを反復したい。理にかなっている?

ありがとうございました。

+1

それは事前に希望するURLのリストを構築することは可能ですか?例。 'url = [" example.com?cid={}".format(x)xの範囲(1、401)に ''?免責事項:私はScrapyを一度も使用していません。 – Kevin

答えて

11

これを試してみてください:

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from syllabi.items import SyllabiItem 

class SyllabiSpider(BaseSpider): 
    name = 'saylor' 
    allowed_domains = ['saylor.org'] 
    max_cid = 400 

    def start_requests(self): 
     for i in range(self.max_cid): 
      yield Request('http://www.saylor.org/site/syllabus.php?cid=%d' % i, 
        callback=self.parse_syllabi) 

    def parse_syllabi(self, response): 
     syllabi = SyllabiItem() 
     syllabi['url'] = response.url 
     syllabi['body'] = response.body 

     return syllabi 
+0

ありがとうございます。今、各ウェブサイトの出力をファイルに分割するにはどうすればよいですか? parse_syllabiで書くための変数名を持つファイルを開くと、すべてのサイトの出力が最後のファイルに行き、もう1つは空のままです。舞台裏で何が起こっているのか分かりません。 –

+0

舞台裏で起こっていることは[Twisted](http://twistedmatrix.com/)と呼ばれる魔法です。役に立つと思われる場合は、この回答を受け入れてから、新しい質問を開いてください。 –

+0

それは役に立ちました。私は新しい質問を始めました。なぜ、Scrapyがループをスキップしているのですか?助けてくれてありがとう。 –

関連する問題