所以我使用了我想通过代理运行的praw API的一些代码。我在this question下找到了以下代码,它对我有用。
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
我的问题是,是否还会通过代理通过管道传输Praw Network?我开始研究praw代码,试图稍微了解它的工作原理,但对我来说太复杂了,我无法决定它是否会工作。 你们中的任何人是否有足够的经验告诉我它的网络是如何工作的,或者袜子代理是如何工作的,或者可以告诉我我如何才能知道?
非常感谢您的帮助。
答案 0 :(得分:0)
是的。 Python使用Requests库发出HTTP(S)请求。根据{{3}}和this answer,requests>=2.10.0
通过PySocks支持SOCKS代理。
截至该答案,prawcore
(praw
所依赖)需要Requests documentation。您可能已经安装了至少requests
的某个版本的2.10.0
,但是您可以通过以下方法进行检查:
$ python3 -c 'import requests; print(requests.__version__)'
如果您安装的版本小于2.10.0
,请升级:
$ python3 -m pip install 'requests >=2.10.0, <3.0'
根据链接的答案,我们设置了dict
的代理(使用'https'
代替'http'
,因为所有PRAW的请求均通过HTTPS进行)
proxies = {'https': 'socks5://127.0.0.1:9050'}
然后,我们必须将其传递给PRAW使用的requests >=2.6.0, <3.0
。我们使用Session
实例化它:
import requests
socks_session = requests.Session(proxies=proxies)
requestor_class
和requestor_kwargs
允许自定义请求者Session
包装在缓存层中。
这是我们将自定义Session
传递给PRAW的方式:
reddit = praw.Reddit(client_id='XX',
client_secret='XX',
user_agent='my_bot by pythoniac',
# ... more kwargs ...
requestor_kwargs={'session': socks_session})
PRAW通过“请求”发出的任何请求都将通过SOCKS代理。
请注意PRAW documentation mentions how to use a custom Session
关于DNS解析的SOCKS代理的看法:
使用方案
socks5
导致DNS解析在客户端而不是在代理服务器上发生。这与curl一致,curl使用该方案来决定是在客户端还是在代理上进行DNS解析。如果要解析代理服务器上的域,请使用socks5h
作为方案。