python访问国外网站报错(‘Connection aborted.‘, error(54, ‘Connection reset by peer‘))解决方案

3,098 阅读3分钟

前言

有关注我博文的人应该知道,我最近在搞大数据方面的东西。有一些数据的需求是需要用到爬虫的,所以这段时间我用python比较多,当然,我也是现学现卖,所以有一些坑也是需要踩的。但是我希望,我踩过的坑,我的读者都能很快跨过去,所以今天在这里分享我踩的一个坑~

场景

由于我现在做的业务是国际方面的,所以我免不了要访问国外的网站,而公司的网络环境又各种限制,所以我只能拿出我的陈年老Mac出来翻墙搞爬虫~

我遇到的问题

访问的是国外的网站,所以我第一步肯定是已经用工具翻过墙啦~

我也验证了,我确实可以访问谷歌,用Chrome和safari都可以。

但是呢,我用python写访问国外网站的代码,就是不行。

要不就连接超时,要不就访问拒绝,报错如下:

requests.exceptions.ConnectionError: HTTPSConnectionPool(host='***', port=443): Max retries exceeded with url: *** (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x104491cc0>: Failed to establish a new connection: [Errno 60] Operation timed out',))
requests.exceptions.ConnectionError: ('Connection aborted.', error(54, 'Connection reset by peer'))

我也上网查了一些资料,verify=false,keep_alive=false这些都加上了,然并卵T^T,该报错还是报错(当然,还是得加上哈)。

转折

我有用postman测试过,访问是正常的,但是一样的请求头,一样的请求参数,放到python和Java中,就是不行。

那有没有可能不是语言的问题呢?

我再试了在其它程序访问需要翻墙的网站,如:在terminal访问谷歌,看能否ping通。

结果跟我想的一样,连接超时~

那我大致知道是啥情况了~

我漏做了一步,我得把request的请求通过我的代理转发出去~

说试就试~

proxy = '127.0.0.1:9180' //这里写代理的ip及端口
proxies = {
     'http': 'http://' + proxy,
     'https': 'https://' + proxy
 }
...
result = s.get(url=req, params=param, headers=headers, verify=False, proxies=proxies)

结果再也不报错了~哈哈哈。

Windows的系统估计也是跟我的Mac一样的问题,毕竟出方向的端口应该不是都一样的,除非你的网络是可以直接访问国外网站的,那应该不会遇到跟我一样的问题啦~

By the way

有问题?可以给我留言或私聊 有收获?那就顺手点个赞呗~

当然,也可以到我的公众号下「6曦轩」,

回复“学习”,即可领取一份 【Java工程师进阶架构师的视频教程】~

回复“面试”,可以获得: 【本人呕心沥血整理的 Java 面试题】

回复“MySQL脑图”,可以获得 【MySQL 知识点梳理高清脑图】

还有【阿里云】【腾讯云】的购买优惠噢~具体请联系我

曦轩我是科班出身的程序员,php,Android以及硬件方面都做过,不过最后还是选择专注于做 Java,所以有啥问题可以到公众号提问讨论(技术情感倾诉都可以哈哈哈),看到的话会尽快回复,希望可以跟大家共同学习进步,关于服务端架构,Java 核心知识解析,职业生涯,面试总结等文章会不定期坚持推送输出,欢迎大家关注~~~

在这里插入图片描述