如何用Scrapy抓取所有标题与文章?求修正我的爬虫代码
修正你的BBC体育爬虫代码
嘿,我帮你排查了下代码里的几个关键问题,咱们一步步来修正,让爬虫能正常抓取文章标题和内容:
主要问题分析
- 你重写了
CrawlSpider的parse方法:CrawlSpider的parse是框架内置用来处理起始URL并应用规则的,自定义这个方法会直接让你设置的rules失效,这是爬虫跑不起来的核心原因之一。 - 规则配置不合理:
allow_list = ['.*']会匹配所有链接,包括导航、分类页这些非文章页面,既浪费资源又抓不到目标内容;而且规则里指定的callback='parse_item'和你实际写的parse_topics方法名不匹配,会报错。 - XPath提取逻辑有问题:用
extract()会返回带HTML标签的字符串列表,我们需要提取纯文本,同时调整XPath路径确保精准定位内容。
修正后的代码
# -*- coding: utf-8 -*- import scrapy from myproject.NLP_items import Headline from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class BBC_sport_Spider(CrawlSpider): name = 'sport' allowed_domains = ['www.bbc.com'] start_urls = ['http://www.bbc.com/sport/'] # 只匹配BBC体育的文章链接(匹配类似/sport/tennis/42610656这种格式) rules = ( Rule( LinkExtractor(allow=r'/sport/[\w-]+/\d+'), callback='parse_article', follow=False ), Rule( LinkExtractor(allow=r'/sport/[\w-]+'), follow=True ), ) def parse_article(self, response): item = Headline() # 提取文章标题的纯文本 item["title"] = response.xpath('//h1[@id="main-heading"]/text()').get(default='') # 提取正文所有段落的纯文本,拼接成字符串 article_paragraphs = response.xpath('//div[@id="story-body"]//p/text()').getall() item["article"] = '\n'.join(article_paragraphs) if article_paragraphs else '' yield item
关键修改说明
- 移除自定义的
parse和parse_topics方法:改用parse_article作为文章解析的回调方法,和规则里的配置对应。 - 优化规则配置:
- 第一个规则:只匹配具体的文章链接(正则
/sport/[\w-]+/\d+),抓取到后调用parse_article解析,不需要继续跟进文章里的链接。 - 第二个规则:匹配体育分类页面(比如/sport/tennis),允许跟进这些页面里的文章链接。
- 第一个规则:只匹配具体的文章链接(正则
- 调整XPath提取逻辑:
- 标题用
//h1[@id="main-heading"]/text()定位,用get(default='')获取纯文本,避免返回None。 - 正文提取所有段落的文本,用
getall()拿到列表后拼接成字符串,保证内容的可读性。
- 标题用
内容的提问来源于stack exchange,提问作者user9191983
相关产品推荐
相关产品推荐

