如何解决 Python 中 Urllib HTTP Error 403 Forbidden Message 错误
今天的文章解释了如何处理错误消息(异常),urllib.error.HTTPError: HTTP Error 403: Forbidden,当它遇到一个被禁止的资源时,由错误类代表请求类产生。
Python 中的 urllib 模块
urllib Python 模块通过不同的协议处理 python 的 URL。 它以想要从特定网站获取数据的网络抓取工具而闻名。
urllib 包含执行某些操作(例如读取、解析 URL 和 robots.txt)的类、方法和函数。 有四个类,request、error、parse、robotparser。
检查 robots.txt 以防止 urllib HTTP 错误 403 禁止消息
当使用 urllib 模块通过请求类与客户端或服务器交互时,我们可能会遇到特定的错误。 其中一个错误是 HTTP 403 错误。
我们在读取 URL 时收到 urllib.error.HTTPError: HTTP Error 403: Forbidden 错误消息。 HTTP 403,即 Forbidden Error,是一个 HTTP 状态代码,表示客户端或服务器禁止访问所请求的资源。
因此,当我们看到这种错误消息时,urllib.error.HTTPError: HTTP Error 403: Forbidden,服务器理解请求但决定不处理或授权我们发送的请求。
要了解为什么我们正在访问的网站没有处理我们的请求,我们需要检查一个重要文件 robots.txt。 在网络抓取或与网站交互之前,通常建议查看此文件以了解会发生什么,并且不会面临任何进一步的麻烦。
要在任何网站上查看它,我们可以按照以下格式进行操作。
https://<website.com>/robots.txt
例如,检查 Google、Amazon 和 Baidu robots.txt 文件。
https://www.google.com/robots.txt
https://www.amazon.com/robots.txt
https://www.baidu.com/robots.txt
检查 Google robots.txt 给出以下结果。
# robots.txt file for YouTube
# Created in the distant future (the year 2000) after
# the robotic uprising of the mid-'90s wiped out all humans.
User-agent: Mediapartners-Google*
Disallow:
User-agent: *
Disallow: /channel/*/community
Disallow: /comment
Disallow: /get_video
Disallow: /get_video_info
Disallow: /get_midroll_info
Disallow: /live_chat
Disallow: /login
Disallow: /results
Disallow: /signup
Disallow: /t/terms
Disallow: /timedtext_video
Disallow: /user/*/community
Disallow: /verify_age
Disallow: /watch_ajax
Disallow: /watch_fragments_ajax
Disallow: /watch_popup
Disallow: /watch_queue_ajax
Sitemap: https://www.google.com/sitemaps/sitemap.xml
Sitemap: https://www.google.com/product/sitemap.xml
我们可以注意到那里有很多 Disallow 标签。 此 Disallow 标记显示网站的区域,该区域不可访问。 因此,对这些区域的任何请求都不会被处理并且被禁止。
在其他 robots.txt 文件中,我们可能会看到一个允许标记。 例如,http://google.com/comment
禁止任何外部请求,即使使用 urllib 模块也是如此。
让我们编写代码从访问时返回 HTTP 403 错误的网站抓取数据。
示例代码:
import urllib.request
import re
webpage = urllib.request.urlopen('https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi').read()
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')
row_array = re.findall(findrows, webpage)
links = re.findall(findlink, webpage)
print(len(row_array))
输出:
Traceback (most recent call last):
File "c:\Users\akinl\Documents\Python\index.py", line 7, in <module>
webpage = urllib.request.urlopen('https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi').read()
File "C:\Python310\lib\urllib\request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "C:\Python310\lib\urllib\request.py", line 525, in open
response = meth(req, response)
File "C:\Python310\lib\urllib\request.py", line 634, in http_response
response = self.parent.error(
File "C:\Python310\lib\urllib\request.py", line 563, in error
return self._call_chain(*args)
File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
result = func(*args)
File "C:\Python310\lib\urllib\request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
原因是我们被禁止访问该网站。 但是,如果我们检查 robots.txt 文件,我们会注意到 https://www.cmegroup.com/markets/ 没有带有 Disallow 标签。 但是,如果我们查看我们想要抓取的网站的 robots.txt 文件,我们将找到以下内容。
User-agent: Python-urllib/1.17
Disallow: /
上面的文字意味着不允许名为 Python-urllib 的用户代理抓取站点内的任何 URL。 这意味着不允许使用 Python urllib 模块来抓取站点。
因此,检查或解析 robots.txt 以了解我们可以访问哪些资源。 我们可以使用 robotparser 类解析 robots.txt 文件。 这些可以防止我们的代码遇到 urllib.error.HTTPError: HTTP Error 403: Forbidden 错误消息。
请求头添加Cookie解决urllib HTTP错误403 Forbidden Message
将有效的用户代理作为标头参数传递将快速解决问题。 本网站可能会使用 cookie 作为反抓取措施。
该网站可能会设置并要求回显 cookie 以防止抓取,这可能违反其政策。
from urllib.request import Request, urlopen
def get_page_content(url, head):
req = Request(url, headers=head)
return urlopen(req)
url = 'https://example.com'
head = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive',
'refere': 'https://example.com',
'cookie': """your cookie value ( you can get that from your web page) """
}
data = get_page_content(url, head).read()
print(data)
输出:
<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta
'
'
'
<p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'
将有效的用户代理作为标头参数传递将快速解决问题。
使用Session对象解决urllib HTTP错误403 Forbidden Message
有时,即使使用用户代理也无法阻止此错误的发生。 然后可以使用请求模块的会话对象。
from random import seed
import requests
url = "https://stackoverflow.com/search?q=html+error+403"
session_obj = requests.Session()
response = session_obj.get(url, headers={"User-Agent": "Mozilla/5.0"})
print(response.status_code)
输出:
200
上面的文章找到了 urllib.error.HTTPError: HTTP Error 403: Forbidden 的原因以及处理的方法。 mod_security 基本上会导致此错误,因为不同的网页使用不同的安全机制来区分人类和自动计算机(bots)。
相关文章
Python 中错误 ValueError: Invalid Literal for Float()
发布时间:2023/05/17 浏览次数:53 分类:Python
-
Python 中 ValueError: invalid literal for float()。 float() 函数无法将字符串类型转换为浮点数。 相反,它会抛出一个 ValueError,它可能会因您的 Python 版本而异。
Python 错误 TypeError: Unhashable Type: List
发布时间:2023/05/17 浏览次数:95 分类:Python
-
本文将讨论 TypeError: unhashable type: 'list' 以及如何在 Python 中修复它。因为 Python 字典只接受可散列数据类型作为它们的键,而列表是不可散列的。
Python 中错误 AttributeError: __Exit__
发布时间:2023/05/17 浏览次数:113 分类:Python
-
尝试用 Python 开发新程序时出错是很常见的。 AttributeError 是 Python 中最常见的错误之一。在本文中,我们将看看如何解决这个 AttributeError: __exit__ 错误,并且我们将通过相关示例和解释来讨论这
Python 错误 TypeError: __str__ Returned Non-String but Printing Output
发布时间:2023/05/17 浏览次数:142 分类:Python
-
本文旨在解决当我们尝试打印字符串而不是在函数中使用 return 语句时出现的问题。Python 错误TypeError: __str__ Returned Non-String but Printing Output
Python 中错误 Path Python3 (From --Python=Python3) Does Not Exist
发布时间:2023/05/17 浏览次数:141 分类:Python
-
错误 The path python3 (from --python=python3) does not exist 可能有几个原因。一种可能是您的系统上没有安装 Python 3。 另一种可能是您安装了多个版本的 Python,而您尝试使用的版本不在您的 PATH 中。
解决 Python ModuleNotFoundError 错误
发布时间:2023/05/17 浏览次数:199 分类:Python
-
此类错误的一个示例是 ModuleNotFoundError。 在本文中,我们将讨论在 Python 中解决 ModuleNotFoundError 的方法。
Python 中 Importerror: Install XLRD for Excel Support 错误
发布时间:2023/05/16 浏览次数:162 分类:Python
-
在本篇文章中,我们将探讨在 Python 中使用 Pandas 包时可能遇到以下错误的原因和解决方案。ImportError: Install xlrd >= 0.9.0 for Excel support 。让我们首先简要介绍一下 Pandas。
解决 Python 中 TypeError: An Integer Is Required 错误
发布时间:2023/05/16 浏览次数:102 分类:Python
-
在 Python 代码中发生的另一个最常见的错误是 TypeError。本文将展示我们如何在 Python 中得到 TypeError。 此外,我们将通过使用必要的示例和解释来讨论该主题,以使该主题更容易理解。
Python 中 ConnectionRefusedError: [Errno 61] Connection Refused 错误
发布时间:2023/05/16 浏览次数:189 分类:Python
-
有时在设计客户端-服务器程序时,您可能会遇到错误 ConnectionRefusedError。Python中 ConnectionRefusedError 错误是如何产生的 正如我们已经讨论过的,这个错误主要发生在客户端程序无法连接到服务器