如何用Python爬取Espacenet搜索结果中的专利链接?
解决Espacenet专利链接爬取问题
可以爬取Espacenet的专利链接和标题,你遇到的问题核心是Cloudflare反爬拦截以及动态内容加载处理不到位,下面是可行的解决方案:
绕过Cloudflare反爬检测
普通Selenium容易被Cloudflare识别拦截,改用undetected-chromedriver工具,它会自动配置浏览器参数绕过检测,避免返回无效的Cloudflare跳转链接。正确处理动态加载内容
Espacenet的搜索结果采用滚动加载机制,需确保103条结果全部加载完成后再提取数据:- 启动浏览器访问目标搜索页,等待页面核心元素加载完毕
- 模拟滚动页面到底部,循环执行直到页面高度不再变化(即所有结果加载完成)
- 定位专利条目对应的HTML元素(通常每个条目包含标题和详情链接),提取标题文本和完整链接(需拼接域名
https://worldwide.espacenet.com)
示例代码
先安装依赖:pip install undetected-chromedriver pandas爬取代码示例:
import undetected_chromedriver as uc import pandas as pd from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器 driver = uc.Chrome() # 替换为你的Espacenet搜索结果URL search_url = "你的搜索结果页面URL" driver.get(search_url) # 等待页面核心元素加载 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "result-item")) ) # 滚动加载所有结果 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 提取专利标题和链接 patent_items = driver.find_elements(By.CLASS_NAME, "result-item") patent_data = [] for item in patent_items: title_elem = item.find_element(By.TAG_NAME, "h3") link_elem = title_elem.find_element(By.TAG_NAME, "a") patent_title = title_elem.text.strip() patent_link = "https://worldwide.espacenet.com" + link_elem.get_attribute("href") patent_data.append({"标题": patent_title, "链接": patent_link}) # 转换为DataFrame df = pd.DataFrame(patent_data) print(df) # 关闭浏览器 driver.quit()关于JSONDecodeError的说明
Espacenet的接口逻辑和Google专利完全不同,直接套用Google专利的请求方式必然失败,必须通过浏览器渲染的方式获取动态加载的页面内容。
内容的提问来源于stack exchange,提问作者Anna Gromovich
相关产品推荐
相关产品推荐

