USPTO专利公共搜索非Selenium爬取专利文本遇权限及请求限制问题
USPTO专利爬取429/401错误解决办法
核心问题分析
- 直接复用抓包的URL无效,因为
queryId是会话绑定的动态参数,每次新会话都会生成新值,旧值会触发401未授权。 - 429是请求频率触发了反爬限制,需要控制请求节奏。
具体解决步骤
用Session保持会话
使用requests.Session()维持与USPTO的会话,自动管理cookie和动态参数,避免每次请求重建连接导致的授权失败。先加载初始页面获取会话参数
先访问Patent Public Search的首页或搜索入口页面,让服务器生成并返回有效的会话cookie和queryId等动态参数,后续请求基于这个会话发起。完善请求头
除了现有头,补充模拟真实浏览器的字段,比如Referer、Accept、Accept-Language等,减少被识别为爬虫的概率。控制请求频率
每次请求后添加随机延迟(2-5秒),避免短时间内大量请求触发429限制。
示例代码
import requests import time import random # 初始化会话 session = requests.Session() # 模拟浏览器请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Referer': 'https://ppubs.uspto.gov/pubwebapp/', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9' } # 先访问初始页面,建立会话并获取动态参数 initial_url = 'https://ppubs.uspto.gov/pubwebapp/' session.get(initial_url, headers=headers) # 构造目标专利请求(需根据实际抓包的接口调整) def fetch_patent_data(patent_number): # 示例搜索接口,实际需替换为USPTO真实的专利详情请求接口 search_url = f'https://ppubs.uspto.gov/pubwebapp/api/v1/patents/search?q={patent_number}' try: response = session.get(search_url, headers=headers) response.raise_for_status() data = response.json() # 提取所需字段 patent_info = { 'title': data.get('title'), 'abstract': data.get('abstract'), 'specification': data.get('specification'), 'claims': data.get('claims') } return patent_info except requests.exceptions.HTTPError as e: if e.response.status_code == 429: print(f"请求频率过高,等待10秒后重试...") time.sleep(10) return fetch_patent_data(patent_number) else: print(f"请求失败:{e}") return None finally: # 随机延迟避免反爬 time.sleep(random.uniform(2, 5)) # 调用示例 patent_data = fetch_patent_data('US12345678') print(patent_data)
额外注意事项
- 如果请求必须携带
queryId,可在初始页面的HTML、JS代码或首次搜索请求的响应中提取,再带入后续请求。 - 若仍遇401,可尝试重新建立会话后再发起请求。
内容的提问来源于stack exchange,提问作者Danfeng Yue
相关产品推荐
相关产品推荐

