5

スクレイピーを使用して kickstarter.com プロジェクトを解析したいのですが、start_urls で明示的に指定していないスパイダー検索プロジェクトを作成する方法がわかりません。スクレイピー コードの最初の部分を理解しました (1 つの Web サイトから必要な情報を抽出できます)。ドメイン kickstarter.com/projects の下のすべてのプロジェクトに対してこれを実行することはできません。

私が読んだことから、(1) 開始ページ (kickstarter.com/projects) のリンクを使用する、(2) あるプロジェクト ページからのリンクを使用して別のプロジェクトにジャンプする、および (3) を使用して解析が可能であると信じています。解析する Web ページを見つけるためのサイト マップ (kickstarter.com にはないと思います)。

これらの各方法を何時間も試してみましたが、どこにも行きません.

私はスクレイピーのチュートリアル コードを使用し、その上に構築しました。

これまでのところ動作する部分は次のとおりです。

from scrapy import log
from scrapy.contrib.spiders import CrawlSpider   
from scrapy.selector import HtmlXPathSelector  

from tutorial.items import kickstarteritem

class kickstarter(CrawlSpider):
    name = 'kickstarter'
    allowed_domains = ['kickstarter.com']    
    start_urls = ["http://www.kickstarter.com/projects/brucegoldwell/dragon-keepers-book-iv-fantasy-mystery-magic"]

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

        item = kickstarteritem()
        item['url'] = response.url
        item['name'] = x.select("//div[@class='NS-project_-running_board']/h2[@id='title']/a/text()").extract()
        item['launched'] = x.select("//li[@class='posted']/text()").extract()
        item['ended'] = x.select("//li[@class='ends']/text()").extract()
        item['backers'] = x.select("//span[@class='count']/data[@data-format='number']/@data-value").extract()
        item['pledge'] = x.select("//div[@class='num']/@data-pledged").extract()
        item['goal'] = x.select("//div[@class='num']/@data-goal").extract()
        return item
4

1 に答える 1

5

をサブクラスCrawlSpider化しているため、オーバーライドしないparseでください。CrawlSpiderのリンク クロール ロジックはparse、本当に必要な に含まれています。

クロール自体に関しては、それがrulesclass 属性の目的です。私はそれをテストしていませんが、動作するはずです:

from scrapy.contrib.spiders import CrawlSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.loader import XPathItemLoader
from scrapy.selector import HtmlXPathSelector

from tutorial.items import kickstarteritem

class kickstarter(CrawlSpider):
    name = 'kickstarter'
    allowed_domains = ['kickstarter.com']    
    start_urls = ['http://www.kickstarter.com/discover/recently-launched']

    rules = (
        Rule(
            SgmlLinkExtractor(allow=r'\?page=\d+'),
            follow=True
        ),
        Rule(
            SgmlLinkExtractor(allow=r'/projects/'),
            callback='parse_item'
        )
    )

    def parse_item(self, response):
        xpath = HtmlXPathSelector(response)
        loader = XPathItemLoader(item=kickstarteritem(), response=response)

        loader.add_value('url', response.url)
        loader.add_xpath('name', '//div[@class="NS-project_-running_board"]/h2[@id="title"]/a/text()')
        loader.add_xpath('launched', '//li[@class="posted"]/text()')
        loader.add_xpath('ended', '//li[@class="ends"]/text()')
        loader.add_xpath('backers', '//span[@class="count"]/data[@data-format="number"]/@data-value')
        loader.add_xpath('pledge', '//div[@class="num"]/@data-pledged')
        loader.add_xpath('goal', '//div[@class="num"]/@data-goal')

        yield loader.load_item()

スパイダーは、最近開始されたプロジェクトのページをクロールします。

また、yieldの代わりに使用しreturnます。スパイダーの出力をジェネレーターにしておくことをお勧めします。これにより、リストを保持するリストを作成せずに複数のアイテム/リクエストを生成できます。

于 2013-03-14T02:59:35.290 に答える