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

use*_*991 51 python user-agent urllib python-3.x

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

with urllib.request.urlopen('someurl') as url:
b = url.read()
Run Code Online (Sandbox Code Playgroud)

我一直收到以下错误:

urllib.error.HTTPError: HTTP Error 403: Forbidden
Run Code Online (Sandbox Code Playgroud)

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

我怎么能用python 3解决这个问题?

Mar*_*cny 68

Python文档:

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'))
Run Code Online (Sandbox Code Playgroud)

  • @User停止使用Python 2,这是Python 3 (2认同)

Col*_*son 20

from urllib.request import urlopen, Request

urlopen(Request(url, headers={'User-Agent': 'Mozilla'}))
Run Code Online (Sandbox Code Playgroud)


Ton*_* Xu 5

我刚刚在这里回答了类似的问题: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)
Run Code Online (Sandbox Code Playgroud)

我添加代理的原因是为了监视Charles的流量,这是我得到的流量:

请参阅用户代理