restrict_xpaths参数不过滤已爬网数据

时间:2016-03-10 16:27:41

标签: python xpath scrapy web-crawler scrapy-spider

我正在使用Scrapy 1.0.5并尝试抓取一系列文章来获取其标题和相应的网址。我只想抓取ID为div的{​​{1}}元素内的链接。考虑到这一点,我试图在规则中指定这样的限制,但我无法弄清楚为什么它仍然在该范围之外抓取链接:

devBody

在尝试了解行为时,我使用Chrome开发工具使用XPath查询元素,所有内容都按should运行。但是,当我(尝试)在我的代码中添加相同的步骤序列时,事情不会以同样的方式进行。它在from scrapy import Spider from scrapy.linkextractors import LinkExtractor from scrapy.spiders import Rule from stack.items import StackItem class StackSpider(Spider): name = "stack" allowed_domains = ["dev.mysql.com"] start_urls = ["http://dev.mysql.com/tech-resources/articles/"] rules = (Rule(LinkExtractor(restrict_xpaths='//div[@id="devBody"]',), callback='parse'),) def parse(self, response): entries = response.xpath('//h4') items = [] //using a counter here feels lame but I really couldn't think of a better //way to avoid getting a list of all URLs and titles wrapped into a single object i = 0 for entry in entries: item = StackItem() item['title'] = entry.xpath('//a/text()').extract()[i] item['url'] = entry.xpath('//a/@href').extract()[i] yield item items.append(item) i += 1 之外提取数据,最终misplacing给定文章的网址。 它确实说它取得了57个通缉results,但随后出现了问题。

我无法弄清楚我做错了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要将StackSpider课程设置在CrawlSpider课程上,该课程具有rules属性。请参阅docs here。您将需要重命名您的parse()方法并更改回调,因为CrawlSpider拥有它自己的解析(),如文档中所述。

或计划B。

CrawlSpider对于抓取此页面并没有多大帮助。使用普通蜘蛛并在'h4 / a'组合上循环来获取所需信息非常简单。试试这个

for row in response.xpath('//div[@id="devBody"]/h4'):
    item['title'] = row.xpath('a/text()').extract()
    # get the full url
    item['url'] = response.urljoin(row.xpath('a/@href').extract_first())
    yield item