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

USPTO专利公共搜索非Selenium爬取专利文本遇权限及请求限制问题

USPTO专利爬取429/401错误解决办法

核心问题分析

  • 直接复用抓包的URL无效,因为queryId是会话绑定的动态参数,每次新会话都会生成新值,旧值会触发401未授权。
  • 429是请求频率触发了反爬限制,需要控制请求节奏。

具体解决步骤

  1. 用Session保持会话
    使用requests.Session()维持与USPTO的会话,自动管理cookie和动态参数,避免每次请求重建连接导致的授权失败。

  2. 先加载初始页面获取会话参数
    先访问Patent Public Search的首页或搜索入口页面,让服务器生成并返回有效的会话cookie和queryId等动态参数,后续请求基于这个会话发起。

  3. 完善请求头
    除了现有头,补充模拟真实浏览器的字段,比如Referer、Accept、Accept-Language等,减少被识别为爬虫的概率。

  4. 控制请求频率
    每次请求后添加随机延迟(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:14