【问题标题】:Proxy detection in Python3Python3中的代理检测
【发布时间】:2017-11-14 08:09:42
【问题描述】:

当我在家里使用脚本(同一台电脑!)时,下面的脚本可以正常工作:

import urllib.request

x = urllib.request.urlopen('https://www.google.com/')
print(x.read())

当我在工作中连接时,使用相同的脚本无法正常工作。我不知道代理地址或 IP,所以我的脚本应该使用与 IE 或这台 PC 上的其他任何东西相同的方式。

我找到了一些关于使用代理的建议,但我不知道代理 IP 或详细信息。当我将脚本移动到另一台 PC 时,它可能有不同的代理,所以我认为硬编码不是好方法。 我可以以某种方式通知 Python 自动检测代理设置吗?

【问题讨论】:

  • does not work 短语非常模糊,可以解释。提供错误详细信息可能会解除对您的阻止,而不是转到与 autodetect proxy settings 相关的解决方案?
  • 好的。有道理。当我从公司网络执行它时,我得到这个: urllib.error.URLError: 。当我在家执行相同操作时 - 一切正常,所以问题是如何正确通知 Python 自动检测本地代理设置。我尝试打开的页面没有被阻止(我确定)。

标签: python proxy


【解决方案1】:
  1. 按照您的示例,我假设您正在通过代理进行https 调用。 urllib 文档提示 its not supported。因此,您可能不得不通过http 安定下来。

  2. 为了验证您的设置没有问题,您可以尝试直接打开IP:

import urllib # IP address for `http://www.google.com` is `216.58.205.196` x = urllib.urlopen('http://216.58.205.196') print x.read()
  1. A.在其他各种线程中,有很多关于 Python 的trippy 自动检测代理设置的抱怨。几年前我只遇到过一次这个问题,我选择设置固定代理而不是尝试配置auto-detect。要了解您的代理,您可以转到 chrome url chrome://net-internals/#proxy 或运行 netstat -an | grep EST 命令。

    B.获得代理地址后,您可以使用以下代码:

import urllib # IP address for `http://www.google.com` is `216.58.205.196` x = urllib.urlopen('http://216.58.205.196', proxies={'http': 'http://www.someproxy.com:3128'}) print x.read()
  1. 如果你无法避免https,那么你可以考虑requests库。我没有对此进行测试,但requests documentation 看起来很有希望。原来是这样!
import requests proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } requests.get('https://example.org', proxies=proxies)


编辑:

1:您可能需要设置proxy authentication 才能使3.B. 工作

2:对于特殊字符,您需要输入 unicode 密码:'p@ssw0rd'.decode('utf-8')

希望这会有所帮助!

【讨论】:

  • 与此同时,我设法使用此脚本向前迈进了一步并得到错误:raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 407:需要代理身份验证。我想我知道下一步是什么。感谢您的建议
  • 您将使用一些authentication 作为您的代理,并且由于此脚本不提供任何代理,因此它显然会失败。在答案中添加,谢谢指出!
  • 谢谢。如果我的密码中包含“@”作为特殊字符,我该怎么办?这是真实案例。我的真实密码有这个特殊字符。如果我需要使用这样的东西:username:pass@word@url:port,那么 Python 如何知道哪个“@”是密码的结尾?反正。我想使用 Python 从我们使用的一种云解决方案中获取一些数据。数据采用 JSON 格式,但均使用 https 运行。我还发现不支持HTTPS的信息,那还有什么办法呢?
  • 密码中的特殊字符需要转成unicode。
  • 我想,你可以选择requests 库。在答案中添加但未测试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多