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
相关产品推荐
相关产品推荐

