链接Scrapy后面的问题

时间:2013-02-12 00:44:13

标签: python scrapy

尝试让我的webcrawler抓取从网页中提取的链接。我正在使用Scrapy。我可以使用我的抓取工具成功提取数据,但无法抓取它。我相信问题出在我的规则部分。 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

3 个答案:

答案 0 :(得分: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'
        )
    )
)

答案 1 :(得分:1)

你正在使用一个回调为parse的CrawlSpider,scrapy documentation expressly warns will prevent crawling

将其重命名为parse_items,您应该没问题。

答案 2 :(得分:0)

r'w+'错误(我认为你的意思是r'\w+')而且r'\w{4}/\w+/\w+'看起来不正确,因为它与你的链接不匹配(它缺少一个领先的{{1} }})。你为什么不试试/? 不要忘记r'/wiki/index.php/.+'不包含\w以及可能是文章名称一部分的其他符号。