企业代理环境下配置pytrends使用代理解决连接拒绝问题
解决pytrends在企业代理环境下的连接问题
我之前在企业代理环境里折腾pytrends的时候也踩过这个坑,其实解决起来很简单——因为pytrends底层依赖requests库来和Google Trends接口通信,所以我们只需要把代理配置注入到它的请求会话里就行,给你两种靠谱的方法:
方法1:直接给pytrends的会话设置代理
这种方式只针对pytrends的请求生效,不会影响其他requests调用,推荐用这个:
from pytrends.request import TrendReq # 定义你的代理配置 proxies = { 'http': 'http://user:pass@address:port', 'https': 'http://user:pass@address:port', } # 初始化pytrends实例 pytrend = TrendReq() # 把代理配置更新到它的请求会话里 pytrend.session.proxies.update(proxies) # 现在正常调用build_payload就应该能成功了 pytrend.build_payload(kw_list=['Python', 'pytrends'])
方法2:全局设置requests代理
如果你希望所有基于requests的请求都走这个代理(不止pytrends),可以用这种方式:
import requests from pytrends.request import TrendReq proxies = { 'http': 'http://user:pass@address:port', 'https': 'http://user:pass@address:port', } # 给requests的全局会话设置代理 requests.Session().proxies.update(proxies) # 再初始化pytrends,它会自动使用这个全局代理配置 pytrend = TrendReq() pytrend.build_payload(kw_list=['Python', 'pytrends'])
额外注意事项
如果你的代理用户名或密码里包含特殊字符(比如@、:、/这类),直接写在代理地址里会导致解析错误,这时候需要用urllib.parse.quote来编码:
from urllib.parse import quote from pytrends.request import TrendReq # 对特殊字符进行编码 username = quote('my_user@company.com') password = quote('my_p@ssw0rd') # 构造编码后的代理地址 proxies = { 'http': f'http://{username}:{password}@proxy.company.com:8080', 'https': f'http://{username}:{password}@proxy.company.com:8080', } # 后续步骤和上面一样 pytrend = TrendReq() pytrend.session.proxies.update(proxies) pytrend.build_payload(kw_list=['Python'])
之前你碰到的No connection could be made because the target machine actively refused it错误,本质就是pytrends的请求没有走企业代理,直接被网络拦截了,设置好代理后就能正常建立连接啦。
内容的提问来源于stack exchange,提问作者Mchief




