我正在使用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,但随后出现了问题。
我无法弄清楚我做错了什么。任何帮助将不胜感激。
答案 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