Python 3 urllib HTTP 错误 412:前提条件失败

Posted

技术标签:

【中文标题】Python 3 urllib HTTP 错误 412:前提条件失败【英文标题】:Python 3 urllib HTTP Error 412: Precondition Failed 【发布时间】:2017-12-29 04:33:43 【问题描述】:

我正在尝试解析网站的 html 数据。我写了这段代码:

import urllib.request

def parse(url):
    response = urllib.request.urlopen(url)
    html = response.read()
    strHTML = html.decode()
    return strHTML

website = "http://www.manarat.ac.bd/"
string = parse(website)

但它显示此错误:

Traceback(最近一次调用最后一次): 文件“C:\Users\pupewekate\Videos\RAW\2.py”,第 11 行,在 字符串 = 解析(网站) 解析中的文件“C:\Users\pupewekate\Videos\RAW\2.py”,第 5 行 响应 = urllib.request.urlopen(url) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 223 行,在 urlopen 返回 opener.open(url, data, timeout) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 532 行,公开响应 = meth(req, response) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 642 行,在 http_response 'http' 中,请求、响应、代码、味精、 人类发展报告) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 570 行,错误返回 > self._call_chain(*args) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 504 行,在 _call_chain 结果 = func(*args) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 650 行,在 http_error_default 中引发 HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP 错误 412: 前提 失败

有什么办法吗?

【问题讨论】:

【参考方案1】:

该网站检查用户代理标头。如果它不能识别它的值,它会返回状态码 412:

import requests

print(requests.get('http://www.manarat.ac.bd/'))
# <Response [412]>

print(requests.get('http://www.manarat.ac.bd/', headers='User-Agent': 'Chrome'))
# <Response [200]>

请参阅this answer 了解如何在 urllib 中设置用户代理。

【讨论】:

【参考方案2】:

你可以使用 requests 模块,因为它更容易实现,否则如果你确定使用 urllib,你可以使用这个:

import urllib

def parse(url):
    headers = 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
    response = urllib.request.urlopen(url,headers=headers)
    print response

website = "http://www.manarat.ac.bd/"
string = parse(website)

【讨论】:

以上是关于Python 3 urllib HTTP 错误 412:前提条件失败的主要内容,如果未能解决你的问题,请参考以下文章

Python 使用 urllib2 抓取网页 Http 错误 500

urllib.error.HTTPError:HTTP 错误 404:未找到 - python

python: urllib2.HTTPError: HTTP 错误 405: 方法不允许

七urllib库

python---urllib3库

python3之模块urllib