0

Web ページから抽出されたリンクを Web クローラーにクロールさせようとしています。スクレイピーを使用しています。クローラーでデータを正常にプルできますが、クロールできません。問題はルールセクションにあると思います。Scrapy の新機能。事前にご協力いただきありがとうございます。

私はこのウェブサイトをスクレイピングしています:

http://ballotpedia.org/wiki/index.php/Category:2012_challenger

私がたどろうとしているリンクは、ソースコードでは次のようになります。

/wiki/index.php/A._Ghani

また

/wiki/index.php/A._Keith_Carreiro

これが私のスパイダーのコードです:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider,Rule

from ballot1.items import Ballot1Item

class Ballot1Spider(CrawlSpider):
   name = "stewie"
   allowed_domains = ["ballotpedia.org"]
   start_urls = [
       "http://ballotpedia.org/wiki/index.php/Category:2012_challenger"
   ]
   rules =  (
       Rule (SgmlLinkExtractor(allow=r'w+'), follow=True),
       Rule(SgmlLinkExtractor(allow=r'\w{4}/\w+/\w+'), callback='parse')
   )

 def parse(self, response):
   hxs = HtmlXPathSelector(response)
   sites = hxs.select('*')
   items = []
   for site in sites:
       item = Ballot1Item()
       item['candidate'] = site.select('/html/head/title/text()').extract()
       item['position'] = site.select('//table[@class="infobox"]/tr/td/b/text()').extract()
       item['controversies'] = site.select('//h3/span[@id="Controversies"]/text()').extract()
       item['endorsements'] = site.select('//h3/span[@id="Endorsements"]/text()').extract()
       item['currentposition'] = site.select('//table[@class="infobox"]/tr/td[@style="text-align:center; background-color:red;color:white; font-size:100%; font-weight:bold;"]/text()').extract()
       items.append(item)
   return items
4

3 に答える 3

1

parseのコールバックでCrawlSpider を使用しています

名前を次のように変更すると、問題parse_itemsありません。

于 2013-02-12T12:00:11.600 に答える
1

あなたが求めているリンクは、この要素にのみ存在します:

<div lang="en" dir="ltr" class="mw-content-ltr">

したがって、無関係なリンクを防ぐために XPath を制限する必要があります。

restrict_xpaths='//div[@id="mw-pages"]/div'

最後に、次のようなリンクのみをたどりたい/wiki/index.php?title=Category:2012_challenger&pagefrom=Alison+McCoy#mw-pagesので、最終的なルールは次のようになります。

rules = (
    Rule(
        SgmlLinkExtractor(
            allow=r'&pagefrom='
        ),
        follow=True
    ),
    Rule(
        SgmlLinkExtractor(
            restrict_xpaths='//div[@id="mw-pages"]/div',
            callback='parse'
        )
    )
)
于 2013-02-12T00:55:05.567 に答える
0

r'w+'間違っており(私はあなたが意味していると思いますr'\w+'r'\w{4}/\w+/\w+'、リンクと一致しないため(先頭が欠落しているため)、正しく見えません/。試してみませんr'/wiki/index.php/.+'か?記事名の一部となる可能性のあるその他の記号\wは含まれていないことを忘れないでください。.

于 2013-02-12T00:49:36.317 に答える