这可以实现吗?
是的。 Python 使用 Requests 库发出 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 允许自定义请求者 Reddit 将使用。例如,这允许轻松向请求者添加行为或将其 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 通过 Requests 发出的任何请求都将通过 SOCKS 代理。
DNS 解析
请注意Requests documentation 在 DNS 解析方面对 SOCKS 代理的评价:
使用方案socks5 会导致DNS 解析发生在客户端上,而不是代理服务器上。这与 curl 一致,它使用该方案来决定是在客户端还是代理上进行 DNS 解析。如果要解析代理服务器上的域,请使用socks5h 作为方案。