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

求助:使用BeautifulSoup爬取谷歌专利数据并写入已有CSV文件

解决方案

谷歌专利页面的核心数据(标题、摘要、发明人)大多嵌入在页面的application/ld+json类型脚本里,直接解析这个结构化JSON比纯爬HTML元素更稳定。下面是完整的改进代码,实现你需要的所有功能:

完整代码

import requests
from bs4 import BeautifulSoup
import json
import csv

# 定义要提取的字段
FIELD_NAMES = ["title", "abstract", "claims", "inventors"]

def extract_patent_info(url):
    # 模拟浏览器请求,降低被反爬拦截的概率
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # 初始化默认值,避免字段缺失报错
    patent_data = {
        "title": "N/A",
        "abstract": "N/A",
        "claims": "N/A",
        "inventors": "N/A"
    }
    
    # 解析页面中的JSON数据块
    json_script = soup.find("script", type="application/ld+json")
    if json_script:
        try:
            data = json.loads(json_script.string)
            # 提取标题
            if "name" in data:
                patent_data["title"] = data["name"]
            # 提取摘要
            if "description" in data:
                patent_data["abstract"] = data["description"]
            # 提取发明人
            if "inventor" in data:
                inventors = [inv["name"] for inv in data["inventor"]]
                patent_data["inventors"] = ", ".join(inventors)
        except json.JSONDecodeError:
            pass
    
    # 提取权利要求(保留你原有的逻辑,兼容HTML结构)
    claims = [claim.get_text(strip=True) for claim in soup.select("li.claim, li.claim-dependent")]
    if claims:
        patent_data["claims"] = " ".join(claims)
    
    return patent_data

def append_to_csv(patent_info, csv_file_path):
    # 自动检测CSV文件是否存在,不存在则写入表头,存在则追加数据
    file_exists = False
    try:
        with open(csv_file_path, 'r', newline='', encoding='utf-8') as f:
            file_exists = True
    except FileNotFoundError:
        pass
    
    with open(csv_file_path, 'a', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=FIELD_NAMES)
        if not file_exists:
            writer.writeheader()
        writer.writerow(patent_info)

# 使用示例
if __name__ == "__main__":
    patent_url = "https://patents.google.com/patent/US10000000B2/en"
    info = extract_patent_info(patent_url)
    append_to_csv(info, "patents.csv")
    print("数据已成功追加到CSV")

关键说明

  • JSON数据解析:谷歌专利用Schema.org规范的JSON脚本存储核心元数据,直接解析这个脚本比依赖HTML类名更不容易因为页面更新失效。
  • 反爬处理:添加User-Agent请求头模拟正常浏览器访问,减少被拦截的风险。
  • CSV追加逻辑:自动处理表头,避免覆盖原有数据,同时保证编码统一。
  • 缺失值处理:所有字段默认设为N/A,避免因字段缺失导致代码中断。

注意事项

  • 若谷歌专利页面结构或JSON字段更新,需要检查application/ld+json里的字段名称是否变化(比如发明人字段可能调整名称)。
  • 批量爬取时建议添加延迟(比如time.sleep(2)),避免触发谷歌的反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:26:02