在测试 Telegram 机器人的时候遇到了网络问题(由于众所周知的原因,Telegram 的服务器在国内大部分地区无法访问),于是需要使用代理。我本机上是有一个运行在 1080 端口的 socks5 代理,那么速记一下如何使用。

urllib2

python-telegram-bot 是直接使用的 urllib2,所以我直接让 urllib2 全局使用代理。需要安装 PySocks

pip install PySocks
# 会安装 socks 和 sockshandler 两个模块

使用:

import socks
import urllib2
from sockshandler import SocksiPyHandler
opener = urllib2.build_opener(
    SocksiPyHandler(socks.SOCKS5, address, proxyport=proxyport, **kwargs)  # 额外参数
)
urllib2.install_opener(opener)

requests

让 requests 使用代理就简单多了。requests 本身支持 HTTP_PROXYHTTPS_PROXY 两个环境变量(通过 os.environ 获取)。按照官方说法,要使用全局代理的话也可以直接设置 ALL_PROXY 这个环境变量,不过我测试没有成功。

那么,要让 requests 全局使用代理的话,只要在调用前设置 os.environ['HTTP_PROXY']os.environ['HTTPS_PROXY'] 就可以了,格式是类似 protocol://user:passwd@address:port

更多代码实例可以参考 《Python:使用代理proxy爬虫》,但是注意一点:使用爬虫恶意抓取网站内容不仅是不道德行为,更有可能因违反站点的 ToS 而被封禁帐号/IP,甚至起诉。