问题描述
今天在做作业的时候,有同学反映完全一样的代码,在其他电脑上可以完美运行,再另一台电脑上却出现以下错误
SSLEFror: HTTPSComectionPool(host= w.imdb.com', port.-443): Max retries exceeded with url: /title/tt0110912/reviews?ratingFilter=l(Cased by SSLError(SSLError("bad handshake: SysCallError(10054,'WSAECONNRESET')")
作业代码如下
import requests
import re
def download_imdb_comments():
url = "https://www.imdb.com/title/tt0110912/reviews"
para = {"ratingFilter":"1"}
r= requests.get(url,params=para)
html = r.text
pattern_comment = r'<div class="text show-more__control">(.*)</div>'
comments = re.findall(pattern=pattern_comment,string=html)
return comments
comments = download_imdb_comments()
print(comments)
解决办法
-
此类错误通常原因是因为SSL整数问题,所以首先设置不验证证书
request.get(xxx, xxx, verify=False)
经测试后反映仍然是同一个报错信息。
-
猜测可能是请求头未设置,被网站识别为爬虫,于是设置请求头
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"} requesr.get(XXX, XXX, headers=headers )
经测试后反映仍然是同一个报错信息。
-
猜测可能是IP被封的原因,使用代理IP地址+端口后发起请求
proxies = {'https': "IP地址:端口号"} r= requests.get(url,params=para, proxies=proxies)
获取免费爬虫IP地址教程为:
经测试后反映仍然是同一个报错信息。
-
猜测是连接数量太多,于是设置不保持连接
s = requests.session() s.keep_alive = False
经测试后反映仍然是同一个报错信息。
-
猜测是request库安装错误
但同学反映之前能正常使用reques.get(),只是在这段代码出问题,所以问题排除 -
猜测是,好吧,实在猜不到了,就让她手动打开这个URL,查看能否访问
该同学反映不能打开这个网页,但其他人能正常打开,我似乎发现了问题所在 -
猜测是该电脑当前使用的IP地址被网站封禁
让其打开手机热点,电脑连接后(IP地址已经改变)再运行看是否发生错误。
经测试后反映仍然是同一个报错信息。 -
猜测是运营商的IP地址被封了
同学使用校园卡,手机、电脑均是移动网,让她换一个电信的手机开热点试试。
经测试后反映问题已经解决。
总结
1、第一次遇到这种BUG,可能是该网站将成都地区的移动IP均封禁了,换其他运营商IP就可以解决这个问题。
2、但我还是有疑问,如果真是第一点所说的话,那么在我们之前使用高匿代理IP发起请求的时候,问题就应该得以解决,那个IP地址是我测试没问题后,才发给她的,但是她却运行同样的错误。不过我发了很多个IP地址给她试,她只试了其中一个,也许就那一瞬间,那个代理IP就失效了吧(不过失效也应该是timeout错误,而不是SSLError错误)