求助:使用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
相关产品推荐
相关产品推荐

