python爬虫--常见错误 1)socket.error: [Errno 10054] 2)socket.timeout: timed out
ython socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。因为对一个网站大量的使用urlopen操作,所以会被那个网站认定为攻击行为。有时就不再允许下载。导致urlopen()后,request.read()一直卡死在那里。最后会抛出errno 10054.
这个错误是connection reset by peer.也就是传说的远端主机重置了此连接。原因可能是socket超时时间过长;也可能是request = urllib.request.urlopen(url)之后,没有进行request.close()操作;也可能是没有sleep几秒,导致网站认定这种行为是攻击。
解决方案如下面的代码:
import socket import time timeout = 20 socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置 sleep_download_time = 10 time.sleep(sleep_download_time) #这里时间自己设定 headers = {'User-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36'} request = urllib2.Request(url, headers=headers) response = urllib2.urlopen(request)
加一个headers让网页以为是通过浏览器登录,并且每次open一个网站sleep一段时间
2)socket.timeout: timed out
如果想要遇到这个问题不退出程序继续运行下面的程序,最好加一段try,except,具体解决如下代码:
try: time.sleep(sleep_download_time) request = urllib2.Request(url, headers=headers) response = urllib2.urlopen(request) except urllib2.URLError, e: print e.reason except socket.timeout, e: print u"timeout"