ChatGPT解决这个技术问题 Extra ChatGPT

带有 urllib2 的代理

我打开网址:

site = urllib2.urlopen('http://google.com')

我想要做的是以相同的方式与我在某处告诉我的代理连接:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

但这也没有用。

我知道 urllib2 有类似代理处理程序的东西,但我不记得那个功能了。


Z
ZelluX
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

嗨,@ZelluX,我只想在某些功能上启用代理设置,这是否意味着我必须为每次调用该功能安装和卸载开启器?
@Satoru.Logic 也许您可以编写一个装饰器来简化安装/卸载过程?
urllib2中似乎没有uninstall方法,但我们可以进行一次性代理设置;我们创建一个 request 对象,而不是 installing 打开器,并使用打开器来 open 它。
@Satoru.Logic:我认为传统的方法是配置像 HTTP_PROXY 这样的环境变量,然后检查您的代码是否使用 os.environ["HTTP_PROXY"] 定义。
不要忘记端口号,例如 3128 proxy = urllib2.ProxyHandler({'http': '127.0.0.1:3128'})
d
dcrosta

你必须安装一个 ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')

我在 urlopen 返回 _opener 中得到文件“D:/Desktop/Desktop/mygoogl”,第 64 行,站点 = url.urlopen('google.com) 文件“C:\Python26\lib\urllib2.py”,第 124 行。 open(url, data, timeout) AttributeError: ProxyHandler instance has no attribute 'open'
我错过了对 urllib2.build_opener() 的呼叫
k
kwinkunks

您可以使用环境变量设置代理。

import os
os.environ['http_proxy'] = '127.0.0.1'
os.environ['https_proxy'] = '127.0.0.1'

urllib2 将以这种方式自动添加代理处理程序。您需要分别为不同的协议设置代理,否则它们将失败(就不通过代理而言),见下文。

例如:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
# next line will fail (will not go through the proxy) (https)
urllib2.urlopen('https://www.google.com')

反而

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way both http and https requests go through the proxy
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')

您不应该在下面的两组示例中使用例如 os.environ['http_proxy'] 吗?
b
blueyed

要使用默认系统代理(例如来自 http_support 环境变量),以下适用于当前请求(无需将其全局安装到 urllib2 中):

url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()

H
HCC

除了接受的答案:我的 scipt 给了我一个错误

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

解决方案是在代理字符串前面添加 http://:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

W
Waqar Detho

如果我们想使用代理访问网页,也可以使用请求。 Python 3 代码:

>>> import requests
>>> url = 'http://www.google.com'
>>> proxy = '169.50.87.252:80'
>>> requests.get(url, proxies={"http":proxy})
<Response [200]>

也可以添加多个代理。

>>> proxy1 = '169.50.87.252:80'
>>> proxy2 = '89.34.97.132:8080'
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2})
<Response [200]>

嗨@WaqarDetho 如何知道要使用哪些代理地址?它只是一些随机的IP地址吗?
嗨@AmanSingh 我很久以前就这样做了。但据我记得,我从互联网上找到了这些代理地址。我在代码中手动注入了它们。
p
pensebien

另外为命令行会话设置代理 打开一个您可能想要运行脚本的命令行

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

在该终端中运行您的脚本。