因此,我获得了一些使用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网络?我开始研究praw代码,试图了解它是如何工作的,但它对我来说太复杂了,我无法决定它是否可以工作。你们中有谁有足够的经验告诉我praw是如何联网的,或者socks代理到底是如何工作的,或者可以告诉我如何才能找到答案?
非常感谢你对我的帮助。
发布于 2019-06-14 03:17:46
这是可以实现的吗?
是。Python使用请求库发出HTTP(S)请求。根据this answer和Requests documentation的说法,requests>=2.10.0通过PySocks支持SOCKS代理。
版本兼容性
从这个答案开始,prawcore ( praw所依赖的)需要requests >=2.6.0, <3.0。您可能已经安装了某个至少为2.10.0的requests版本,但您可以通过以下方式进行检查:
$ 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使用的Session。我们使用proxies argument实例化它
import requests
socks_session = requests.Session(proxies=proxies)PRAW documentation mentions how to use a custom Session
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代理。
DNS解析
注意Requests documentation在解析SOCKS代理时是怎么说的:
使用方案socks5的DNS会导致在客户端而不是在代理服务器上进行
解析。这与curl是一致的,curl使用该方案来决定是在客户端还是在代理上执行DNS解析。如果要解析代理服务器上的域,请使用
socks5h作为方案。
https://stackoverflow.com/questions/56558433
复制相似问题