所以我已经得到了一些代码,使用了我想通过代理运行的Praw API。我在这个问题下找到了以下代码,它适用于我。
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代理是如何工作的,或者可以告诉我如何找到答案?
非常感谢你帮助我。
对Python使用请求库发出HTTP(S)请求。根据此回答和请求文档,请求
从这个答案开始,Prawcore
(其Praw
依赖)需要请求
$ 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使用的会话。我们使用
代理
参数实例化它:
import requests
socks_session = requests.Session(proxies=proxies)
PRAW留档提到如何使用自定义会话
:
requestor_class
和requestor_kwargs
允许自定义请求者Reddit
将使用的。这允许,例如,轻松地向请求者添加行为或将其会话
包装在缓存层中。
下面是我们如何将自定义会话
传递给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解析时,请注意请求留档对SOCKS代理的说明:
使用schemesocks5
会导致DNS解析发生在客户端,而不是代理服务器上。这与curl一致,curl使用该方案来决定是在客户端还是在代理服务器上进行DNS解析。如果要解析代理服务器上的域,请使用socks5h
作为方案。