Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

运行报错 #9

Closed
xumengen opened this issue Aug 27, 2020 · 9 comments
Closed

运行报错 #9

xumengen opened this issue Aug 27, 2020 · 9 comments

Comments

@xumengen
Copy link

错误提示没有proxy_pool_temp.list这个文件,是需要我自己去生成吗,我看代码里直接指定file_name = 'proxy_pool_temp.list'
Screenshot from 2020-08-27 16-44-57

@xumengen
Copy link
Author

Screenshot from 2020-08-27 16-47-43

@NormanBB
Copy link
Owner

use proxy from github.com/jhao104/proxy_pool
开始验证代理
验证代理完成,用时: 18.88 s 
使用验证proxy_pool代理
输入问卷地址:

在我这里运行时,检验时间是19秒左右。你可能因为网络问题没有获取到代理。可尝试更换另一代理来源,或者重新运行几次程序。

也可以将我给的文件放入运行程序的文件夹中。
proxy_pool_temp.txt

@WqVoon
Copy link

WqVoon commented Sep 4, 2020

你好,问题的原因也许不在网络问题上,而在于 urllib3

我认为 这个issue 可以为这个问题提供更详细的信息

如果把 check.py 中的 try-catch 块去掉,就可以看到其抛出了 urllib3.exceptions.ProxySchemeUnknown 异常,导致流程没能进入到创建 *_temp.txt 文件那里,进而引发找不到文件的问题

根据上面链接提供的办法,我为 ProxyTask._proxy 添加了 “https://” 前缀,从而正常执行了脚本

希望该建议可以帮助到你 :-)

@NormanBB
Copy link
Owner

NormanBB commented Sep 6, 2020

你好,问题的原因也许不在网络问题上,而在于 urllib3

我认为 这个issue 可以为这个问题提供更详细的信息

如果把 check.py 中的 try-catch 块去掉,就可以看到其抛出了 urllib3.exceptions.ProxySchemeUnknown 异常,导致流程没能进入到创建 *_temp.txt 文件那里,进而引发找不到文件的问题

根据上面链接提供的办法,我为 ProxyTask._proxy 添加了 “https://” 前缀,从而正常执行了脚本

希望该建议可以帮助到你 :-)

多谢反馈。

@NormanBB NormanBB closed this as completed Sep 6, 2020
@NormanBB NormanBB reopened this Sep 7, 2020
@NormanBB
Copy link
Owner

NormanBB commented Sep 7, 2020

@WqVoon 目前在我这测试出现的问题是使用的proxy_pool 无可用代理导致没有文件写入,更换代理来源可解决。

而楼主最明显的问题是没有获取到可用代理,体现在验证时间小于一秒。

@WqVoon
Copy link

WqVoon commented Sep 8, 2020

@NormanBB 如果 “无可用代理导致没有文件写入” 指的是 check.py 的 r1.status_code 不等于 200 的话,确实也会导致 temp 文件无法被建立,但是我认为验证时间小于一秒 不太可能 是出于这个原因,请看我下面的截图:
info

左边是 self._proxy 直接等于 ip+port 的情况,右边则是加入了 “https://” 前缀,两者均工作在同样的解释器环境下,并在运行前删除了当前目录中所有的 proxy 文件,结果左边的验证时间小于1秒且没有 temp 文件产生,而右边的验证时间合理且产生了 temp 文件。

这里左边会小于1秒,是因为 check.py 中的 request.post 请求在我的环境下没有发出去,它产生了我上面提到的异常,导致整个 ProxyTask.run 相当于只执行了第一句代码,所以很快就“验证”完了;但是如果是没有获取到代理的话,那么它至少建立了连接,所以时间会比前者提到的情况要长,尤其当遇到超时的情况时 requests 会等待10秒。

另外对于我提到的添加前缀的问题,现在的改动似乎只是在验证代理时添加了前缀,写入到 temp 里时依然是 ip+port 的情况,这样在实际对问卷发送 post 请求时(指 Auto_WjX 函数),请求依然会因为我上面提到的问题而无法发送,所以改动的方法应该是将 temp 文件里的内容也加入前缀

@NormanBB
Copy link
Owner

NormanBB commented Sep 8, 2020

我意识到了应该在两处都进行改动。

但我在这边无法复现 urllib3.exceptions.ProxySchemeUnknown异常。

批注 2020-09-08 124844

这是两个语句运行两次的结果。

我认为验证时间小于一秒可能是因为网络问题无法连接到 httpbin,需要启用代理。而你所说的ProxySchemeUnknown的改动方法在一些情况下使程序可以正常运行。

环境:gitpod 网页,服务器在国外。

@WqVoon
Copy link

WqVoon commented Sep 8, 2020

我觉得异常无法复现的原因更多的是版本的问题,可以看到 gitpod 中的 python 版本是 3.8.3,而我的环境中 py 的版本是 3.7.6

据上面的 issue 链接中所言,这个异常在这种上下文中会出现的原因在于 requests.utils 的一个函数利用 urllib3 的方式有问题(本质上似乎还是 urllib3 的问题),一个调用的例子是__import__("requests").utils.prepend_scheme_if_needed("0.0.0.0:8888", "https") ,这句代码的结果会因环境的不同而有差异,我本地对这句代码的执行结果是 0.0.0.0://8888,可以看到并不是一个有效的 url,而在 gitpod 中执行后会获得 https://0.0.0.0:8888 的正确结果;但语句 __import__("requests").utils.prepend_scheme_if_needed("https://0.0.0.0:8888", "https") (添加了 “https://” 前缀)在两个环境中则都可以获得正确的结果。

至于无法连接到 httpbin 的想法,我觉得它就是我说的 “尤其当遇到超时的情况时 requests 会等待10秒” 的情况,比如你可以在国内网络环境下发送一个 get 请求到 Google,requests 会根据 timeout 的值等待对应的秒数后抛出 requests.exceptions.ConnectTimeout 异常。

@NormanBB
Copy link
Owner

NormanBB commented Sep 8, 2020

我觉得异常无法复现的原因更多的是版本的问题,可以看到 gitpod 中的 python 版本是 3.8.3,而我的环境中 py 的版本是 3.7.6

据上面的 issue 链接中所言,这个异常在这种上下文中会出现的原因在于 requests.utils 的一个函数利用 urllib3 的方式有问题(本质上似乎还是 urllib3 的问题),一个调用的例子是__import__("requests").utils.prepend_scheme_if_needed("0.0.0.0:8888", "https") ,这句代码的结果会因环境的不同而有差异,我本地对这句代码的执行结果是 0.0.0.0://8888,可以看到并不是一个有效的 url,而在 gitpod 中执行后会获得 https://0.0.0.0:8888 的正确结果;但语句 __import__("requests").utils.prepend_scheme_if_needed("https://0.0.0.0:8888", "https") (添加了 “https://” 前缀)在两个环境中则都可以获得正确的结果。

至于无法连接到 httpbin 的想法,我觉得它就是我说的 “尤其当遇到超时的情况时 requests 会等待10秒” 的情况,比如你可以在国内网络环境下发送一个 get 请求到 Google,requests 会根据 timeout 的值等待对应的秒数后抛出 requests.exceptions.ConnectTimeout 异常。

多谢指点。目前已完成两处修正。

如果对项目有pr就更好了。:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants