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

Scrapy配置start_urls爬取文章运行报错如何修复

问题根因

手动访问正常但爬虫报错,核心是三个问题:

  • Scrapy默认请求头携带Scrapy版本标识,被网站基础反爬策略拦截,返回的不是正常的列表页内容,导致XPath匹配流程直接触发异常
  • 列表页提取的文章链接是相对路径(无域名前缀),直接发起请求会访问无效地址
  • 部分字段的XPath规则和详情页实际DOM结构不匹配,且未提取节点文本,就算请求成功也拿不到正确数据
修复方案
  1. 给爬虫配置模拟浏览器的请求头,绕过UA校验
  2. 对提取到的相对链接做域名拼接,生成合法的绝对访问地址
  3. 修正各字段XPath规则,补充文本提取逻辑
  4. 增加空值兜底,避免节点缺失时触发报错

修复后可正常运行的完整代码:

import scrapy
from scrapy.crawler import CrawlerProcess

class weeklymining(scrapy.Spider):
    name = 'weeklymining'
    # 配置模拟浏览器请求头,绕过基础反爬
    custom_settings = {
        'DEFAULT_REQUEST_HEADERS': {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        }
    }
    start_urls = ['https://www.miningweekly.com/page/coal/page:'+str(x) for x in range(1,4)]

    def parse(self, response):
        # 提取所有文章详情页链接
        for link in response.xpath('//*[@class="en-serif"]/a/@href'):
            article_url = response.urljoin(link.get())
            yield scrapy.Request(
                url=article_url,
                callback=self.parse_item
            )

    def parse_item(self, response):
        yield {
            # 修正XPath,补充/text()提取日期文本
            'date': response.xpath('//*[@class="sml"]/p/span[1]/text()').get(default='').strip(),
            'category': 'coal',
            # 修正标题XPath,匹配详情页h1节点
            'title': response.xpath('//*[@class="article_title"]/h1/text()').get(default='').strip(),
            # 提取正文,过滤空文本
            'text':''.join([x.get().strip() for x in response.xpath('//*[@id="article_content_container"]//p//text()') if x.get().strip()])
            }
            
if __name__ == '__main__':
    process = CrawlerProcess(settings={
        'FEED_URI': 'coal_article.json',
        'FEED_FORMAT': 'json',
        'LOG_LEVEL': 'INFO'
    })
    process.crawl(weeklymining)
    process.start()
代码修改点说明
  • 新增custom_settings配置,替换默认Scrapy请求头为Chrome浏览器标识,同时配置基础Accept参数,模拟真实用户访问,绕过网站UA拦截
  • 使用response.urljoin()方法自动拼接提取到的相对链接和网站域名,避免访问无效地址
  • 修正日期字段XPath,补充/text()规则,直接提取日期文本而非整个span标签,同时增加空值兜底和去空格处理
  • 修正标题字段XPath,匹配详情页实际的h1标题节点,原规则写的h2/a是列表页的标题匹配逻辑,不适用于详情页
  • 正文提取逻辑增加空文本过滤,避免拼接大量无意义的空白字符
  • 启动配置里增加了导出为json文件的设置,运行后可直接在同目录生成爬取结果文件,同时调整日志等级减少冗余输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:54:36