You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

关键修改说明

  1. 移除自定义的parse和parse_topics方法:改用parse_article作为文章解析的回调方法,和规则里的配置对应。
  2. 优化规则配置:
    • 第一个规则:只匹配具体的文章链接(正则/sport/[\w-]+/\d+),抓取到后调用parse_article解析,不需要继续跟进文章里的链接。
    • 第二个规则:匹配体育分类页面(比如/sport/tennis),允许跟进这些页面里的文章链接。
  3. 调整XPath提取逻辑:
    • 标题用//h1[@id="main-heading"]/text()定位,用get(default='')获取纯文本,避免返回None。
    • 正文提取所有段落的文本,用getall()拿到列表后拼接成字符串,保证内容的可读性。

内容的提问来源于stack exchange,提问作者user9191983

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:27:23