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

Scrapy新手求助:爬取espacenet网站返回title为None的问题

Scrapy爬取espacenet专利标题返回None的问题修复

问题分析

你的爬虫返回title为None,核心问题集中在三个方面:自定义请求未生效、选择器不稳定、页面可能存在动态渲染。

具体修复步骤

1. 修复自定义User-Agent的请求方法

你编写的request_header不是Scrapy的标准入口方法,框架不会自动执行它,导致自定义User-Agent未生效,可能被网站识别为爬虫返回异常内容。

将方法名改为Scrapy标准的start_requests,并正确遍历start_urls:

def start_requests(self):
    for url in self.start_urls:
        yield scrapy.Request(url=url, callback=self.parse, headers={'User-Agent': self.user_agent})

2. 替换不稳定的XPath选择器

你使用的类名(如h2--2VrrSjFb)是网站动态生成的随机字符串,网站更新后会直接失效。改用基于标签结构或固定特征的选择器:

# 匹配包含固定类名片段的h2标签下的span文本
titles = response.xpath("//h2[contains(@class, 'item__content--title')]/span/text()").extract()
for title in titles:
    yield {
        'title': title.strip()
    }

3. 处理动态渲染页面

如果修改后仍返回None,说明页面内容是通过JavaScript动态加载的,Scrapy默认下载器只能获取静态HTML。此时需要集成渲染工具:

  • 使用scrapy-playwright:安装依赖后,在请求中添加meta={'playwright': True},让Playwright渲染JS内容。
  • 使用scrapy-splash:配置Splash服务后,通过SplashRequest请求页面。

修改后的完整代码

class IndiaSpider(scrapy.Spider):
    name = 'espace'
    allowed_domains = ['worldwide.espacenet.com']
    search_value = 'laptop'
    start_urls = [f'https://worldwide.espacenet.com/patent/search?q={search_value}']

    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url=url, callback=self.parse, headers={'User-Agent': self.user_agent})

    def parse(self, response):
        # 可选:打印页面片段验证内容是否存在
        # print(response.text[:2000])
        titles = response.xpath("//h2[contains(@class, 'item__content--title')]/span/text()").extract()
        for title in titles:
            yield {
                'title': title.strip()
            }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:50:38