Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 3中为urrlib.request.urlopen更改用户代理_Python_Python 3.x_Urllib_User Agent - Fatal编程技术网

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

在Python 3中为urrlib.request.urlopen更改用户代理,python,python-3.x,urllib,user-agent,Python,Python 3.x,Urllib,User Agent,我想使用urllib.request.urlopen('someurl')打开一个url: 我不断得到以下错误: urllib.error.HTTPError: HTTP Error 403: Forbidden 我理解这个错误是由于网站不允许python访问它,以阻止机器人浪费他们的网络资源——这是可以理解的。我进行了搜索,发现您需要更改urllib的用户代理。然而,我为这个问题找到的关于如何更改用户代理的所有指南和解决方案都是使用urllib2的,我使用的是python 3,所以所有的解决

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

我不断得到以下错误:

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

如何使用python 3解决此问题?

来自:


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

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


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

我刚才在这里回答了一个类似的问题:

如果您不仅想打开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的流量,下面是我得到的流量:


a可能不是由于您的用户代理。太棒了!这几乎奏效了——只是想知道如何从中获得源代码——通常我会使用url.read()但是它在这种情况下不起作用,因为它是一个urllib.request.request而不是urlopen?更新了答案,以便您可以看到如何使用它。
import-urllib.request-ImportError:没有名为request的模块
HTTP错误404:没有Found@User停止使用Python 2,这是Python 3这很重要。我必须导入urllib.request,而不仅仅是urllib。接受答案中的所有其他内容都与此修改一起工作。是的,您可以,但接受答案不起作用,因此我想提请大家注意您的答案,因为它解决了接受答案中的一个缺陷。HTTP错误404:未找到感谢您提供了一个使用build_opener()返回的OpenerDirectory对象的答案!这对我帮助很大
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'))
from urllib.request import urlopen, Request

urlopen(Request(url, headers={'User-Agent': 'Mozilla'}))
    # 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)