部署在Heroku的Python Telegram Bot无法连接WordReference
看起来你遇到的核心问题是WordReference针对Heroku IP或免费代理做了访问限制,毕竟其他网站爬取正常,说明Heroku本身的网络配置没问题。下面是几个可行的排查和解决方向:
模拟浏览器请求头,绕过基础反爬
很多网站会通过检查User-Agent识别非浏览器请求,直接用requests默认的头很容易被拦截。给请求添加标准的浏览器UA试试:headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } page = 'http://www.wordreference.com/sinonimos/{}'.format(word) r = requests.get(page, headers=headers)同时注意不要高频请求,给每个请求加个1-2秒的延迟,避免触发频率限制。
替换稳定的代理服务
免费代理的生命周期极短,而且大概率已经被WordReference加入黑名单。如果必须用代理,建议换成付费的代理池服务,或者使用Heroku官方的代理附加组件(比如Proximo),这类服务的IP池更大、更稳定,被屏蔽的概率低很多。检查WordReference的爬取规则
先访问http://www.wordreference.com/robots.txt,确认/sinonimos/路径是否允许爬虫访问。如果该路径被禁止,你的爬取行为本身就违反了网站规则,被拦截是必然的,这种情况下建议改用官方API(如果有的话)或者寻找替代的同义词数据源。增强错误日志排查
现在的日志只显示连接失败,建议添加更详细的日志记录,比如请求的状态码、响应内容片段,帮助判断是IP被封还是代理失效:import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) try: r = requests.get(page, headers=headers) logger.info(f"Request to {page} returned status code: {r.status_code}") if r.status_code == 403: logger.warning("Received 403 Forbidden - likely blocked by anti-scraping") r.raise_for_status() except requests.exceptions.RequestException as e: logger.error(f"Error fetching {word}: {str(e)}")尝试HTTPS访问
你当前用的是HTTP协议,试试换成HTTPS的URL:https://www.wordreference.com/sinonimos/{}, 有些网站会强制HTTPS,HTTP请求可能被拦截或重定向失败。
内容的提问来源于stack exchange,提问作者J.L.G

