You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

企业代理环境下配置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

火山引擎 最新活动