在 Python 3 中为 urllib.request.urlopen 更改用户代理

Posted

技术标签:

【中文标题】在 Python 3 中为 urllib.request.urlopen 更改用户代理【英文标题】:Changing User Agent in Python 3 for urrlib.request.urlopen 【发布时间】:2014-08-05 06:43:11 【问题描述】:

我想用urllib.request.urlopen('someurl')打开一个网址:

with urllib.request.urlopen('someurl') as url:
b = url.read()

我不断收到以下错误:

urllib.error.HTTPError: HTTP Error 403: Forbidden

我理解该错误是由于该站点不允许 python 访问它,以阻止机器人浪费他们的网络资源 - 这是可以理解的。我去搜索,发现你需要更改 urllib 的用户代理。然而,我为这个问题找到的关于如何更改用户代理的所有指南和解决方案都使用了 urllib2,而且我使用的是 python 3,所以所有解决方案都不起作用。

如何用 python 3 解决这个问题?

【问题讨论】:

a 403 error 可能不是由于您的用户代理。 【参考方案1】:

来自Python docs:

import urllib.request
req = urllib.request.Request(
    url, 
    data=None, 
    headers=
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    
)

f = urllib.request.urlopen(req)
print(f.read().decode('utf-8'))

【讨论】:

太棒了!那几乎可以工作了-只是想知道如何从中获取源代码-通常我会使用 url.read() 但在这种情况下它不起作用,因为它是 urllib.request.Request 而不是 urlopen? 更新了答案,以便您了解如何使用它。 import urllib.request ImportError: No module named request HTTP 错误 404:未找到 @User 停止使用 Python 2,这是 Python 3【参考方案2】:
from urllib.request import urlopen, Request

urlopen(Request(url, headers='User-Agent': 'Mozilla'))

【讨论】:

这很重要。我必须导入 urllib.request 而不仅仅是 urllib。接受的答案中的所有其他内容都适用于此修改。 是的,你有,但接受的答案没有,所以我想提请注意你的答案,因为它解决了接受的答案中的一个缺陷。 HTTP 错误 404:未找到【参考方案3】:

主机站点拒绝来自 Apache mod-security 的 OWASP ModSecurity 核心规则。规则 900002 有一个“坏”用户代理列表,其中之一是“python-urllib2”。这就是使用默认用户代理的请求失败的原因。

不幸的是,如果你使用 Python 的“robotparser”函​​数,

https://docs.python.org/3.5/library/urllib.robotparser.html?highlight=robotparser#module-urllib.robotparser

它使用默认的 Python 用户代理,并且没有参数可以改变它。如果“robotparser”尝试读取“robots.txt”被拒绝(不仅仅是 URL 未找到),它会将来自该站点的所有 URL 视为不允许。

【讨论】:

【参考方案4】:

我刚刚在这里回答了一个类似的问题:https://***.com/a/43501438/206820

如果你不仅想打开 URL,还想下载资源(比如 PDF 文件),你可以使用如下代码:

    # proxy = ProxyHandler('http': 'http://192.168.1.31:8888')
    proxy = ProxyHandler()
    opener = build_opener(proxy)
    opener.addheaders = [('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30')]
    install_opener(opener)

    result = urlretrieve(url=file_url, filename=file_name)

我添加代理的原因是为了监控查尔斯的流量,这里是我得到的流量:

【讨论】:

感谢您提供使用 build_opener() 返回的 OpenerDirector 对象的答案!这对我帮助很大

以上是关于在 Python 3 中为 urllib.request.urlopen 更改用户代理的主要内容,如果未能解决你的问题,请参考以下文章

在终端中为python 3创建虚拟环境

为啥 range(0) == range(2, 2, 2) 在 Python 3 中为真?

在 Python 3 中为 urllib.request.urlopen 更改用户代理

在树莓派中为 python 3 安装 mysql 连接器

在Windows 10 python 3中为Twisted构建轮子失败

如何在Tkinter,Python 3中为方块提供随机方向