python urllib request http error

问题是执行urllib.request.urlopen(request)时候,收到 urllib.error.HTTPError: HTTP Error 400:

这是报错的信息

img

这是header的信息

img

这是dataload的信息

img

这是python的create request程序,感觉应该是什么数据不对,但是检查过它和header的信息是一致的。

def create_request():
    url = 'https://ppubs.uspto.gov/dirsearch-public/searches/generic'

    data = {
        'cursorMarker':'AoJwwOOcgokDOjgxNzUwNDE5IVBHLVVTLTIwMjMwMjA2OTEz',
        'databaseFilters':'[{"databaseName": "USPAT"},{"databaseName": "US-PGPUB"},{"databaseName": "USOCR"}]',
        'fields':'["documentId","patentNumber","title","datePublished","inventors","pageCount"]',
        'op':'AND',
        'pageSize':'50',
        'q':'toy AND car',
        'searchType':'0',
        'sort':'date_publ desc',
    }

    #for POST request, need to encode
    data = urllib.parse.urlencode(data).encode('utf-8')

    headers = {
        'Authority': 'ppubs.uspto.gov',
        'Method': 'POST',
        'Path': '/dirsearch-public/searches/generic',
        'Scheme': 'https',
        'Accept': 'application/json',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Content-Length': '334',
        'Content-Type': 'application/json',
        'Origin': 'https://ppubs.uspto.gov',
        'Referer': 'https://ppubs.uspto.gov/pubwebapp/static/pages/ppubsbasic.html',
        'Sec-Ch-Ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Microsoft Edge";v="114"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Ch-Ua-Platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        '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 Edg/114.0.1823.79',
    }

    #for POST request, need to input data
    request = urllib.request.Request(url=url, headers=headers, data=data)
    return request
  • cv您的url——https://ppubs.uspto.gov/dirsearch-public/searches/generic
    填入浏览器地址栏回车,返回了405异常。

    img

  • 405
    405是HTTP协议中的一种错误状态码。它表示客户端向服务器发送了一种不被支持的请求方法,导致服务器无法处理该请求,并返回了该状态码。

  • 您的400报错码
    400 Bad Request:表示客户端发出的请求存在语法错误


  请检查您的url是否存在拼写错误,代码语法是否存在不妥的地方。


  • 这篇博客: Python爬虫入门:urllib.request.urlopen详解中的 data参数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • data参数是可选的,并且是字节流编码格式(可以用urllib.parse.urlencode()和bytes()方法将参数转化为字节流编码格式的内容)。如果要使用data参数,则请求方式为POST。

    import urllib.parse
    import urllib.request
    
    data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
    response = urllib.request.urlopen('http://httpbin.org/post', data=data)
    print(response.read().decode('utf8'))
    
  • 以下回答由chatgpt基于相关博客总结生成:

    要处理Python urllib请求的HTTP错误,可以使用try-except来捕捉HTTPError错误,然后进行相应的处理。以下是一种解决方案:

    import urllib
    from urllib import request
    
    url = 'http://example.com'  # 设置要发送请求的URL
    headers = {'User-Agent': 'Mozilla/5.0'}  # 设置请求头信息
    
    try:
        req = request.Request(url, headers=headers)
        response = request.urlopen(req)
        # 处理正常逻辑
        print(response.read().decode('utf-8'))
    except urllib.error.HTTPError as e:
        # 处理HTTP错误
        print(e.code, e.reason)
    

    在上述代码中,我们通过设置请求头信息,创建一个Request对象,并使用urlopen发送HTTP请求。如果出现HTTP错误,会抛出urllib.error.HTTPError异常,我们可以通过捕捉该异常来处理错误情况。在异常处理的代码块中,可以根据具体的需求,决定如何处理HTTP错误。

    在这个例子中,我们简单地打印了错误的状态码和原因。你也可以根据实际情况,采取其他处理方式,如重试请求、记录错误日志等。

    这是一种处理HTTP错误的常见方法,但具体的处理方式取决于你对错误情况的处理需求。