爬虫卡住无报错信息

用了requests库,爬取了一晚上,程序在某个页面hang住了,没有任何报错信息,也不退出,也不前进,日志和进程查不出问题。

操作回顾:

  1. 查看nohup.out,无任何异常数据;

  2. 查看程序log,在183页有数据,184页数据未出现;

  3. ps aux |grep 查看进程,未占用大量cpu和内存,排除死循环;

  4. 查看代码,未使用多线程多进程,排除死锁;

  5. 查看问题进程打开的文件,lsof -p xx,发现最后打开的文件是建立了2个tcp连接,并且一直未断开,考虑io阻塞的可能性;

  6. 再次查看代码,设置了io连接重试,未设置连接超时,但自己一直以为requests库有默认超时,故不得其解;

  7. 再次lsof查看,跟进lsof -i:port看建立的是什么连接端口,发现是https

  8. 网上搜索requests库超时重试问题,得到下面一句话:

     读取超时是没有默认值的,如果不设置,程序将一直处于等待状态
    

豁然开朗!
一直以为的默认超时是连接超时,默认2s,并且session中通过adapter设置的retry重试也是简单的默认针对连接超时超时,除非使用Retry对象详细指定超时机制。

解决方法:

  1. request.get方法设置timeout=(5,10),如果简单的设置timeout=5还是设定的连接超时。默认超时一直等到是为了防止下载流连接的情况。
  2. 然后可以用Retry指定session中的adapter读取超时重试次数;

你可能感兴趣的:(Python)