我想使用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修复此问题?
答案 0 :(得分:58)
来自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'))
答案 1 :(得分:20)
from urllib.request import urlopen, Request
urlopen(Request(url, headers={'User-Agent': 'Mozilla'}))
答案 2 :(得分:3)
我刚才在这里回答了类似的问题:https://stackoverflow.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)
我添加代理的原因是为了监控Charles的流量,这是我得到的流量:
答案 3 :(得分:-1)
主机站点拒绝来自Apache mod安全的OWASP ModSecurity核心规则。规则900002有一个“坏”用户代理列表,其中一个是“python-urllib2”。这就是使用默认用户代理的请求失败的原因。
不幸的是,如果您使用Python的“robotparser”功能,
它使用默认的Python用户代理,并且没有参数可以更改它。如果“robotparser”试图阅读“robots.txt”被拒绝(不仅仅是找不到URL),那么它会将该网站上的所有网址视为不允许。