使用py-spy解决scrapy卡死的问题方法


Posted in Python onSeptember 29, 2020

背景

在使用scrapy爬取东西的时候,使用crontab定时的启动爬虫,但是发现机器上经常产生很多卡死的scrapy进程,一段时间不管的话,会导致有10几个进程都卡死在那,并且会导致数据产出延迟。

问题定位

使用py-spy这个非常好用的python性能分析工具来进行排查,py-spy可以查看一个python进程函数调用用时,类似unix下的top命令。所以我们用这个工具看看是什么函数一直在执行。

首先安装这个工具

pip install py-spy

用py-spy看看scrapy哪个函数执行时间长

# 先找到这个卡死的scrapy进程的pid
ps -ef |grep scrapy 
# 启动 py-spy 观察这进程
py-spy top --pid 53424

首先我们按3,按OwnTime进行排序,这个表示函数自身执行的时间,可以看到read这个函数执行的时间最长,那看来是IO导致的,程序中的IO行为就是读写磁盘和网络IO,磁盘读写一般不会有问题,所以初步定位是网络IO导致的。

使用py-spy解决scrapy卡死的问题方法

接下来进行进一步确认,再按4,按TotalTIme 所有子函数执行时间总和进行排序,可以看到是在process_item和download,upload_image这些主流程函数的执行时间比较长,这一步是先把图片下载到本地,然后上传到静床,看来是下载这步从网络中read数据时出现了问题,进一步追踪代码。

使用py-spy解决scrapy卡死的问题方法

看下download的函数的代码:

if filename == '':
      filename = os.path.basename(url)
    path = path + '/' + filename
    
    try:
      res = request.urlretrieve(url,filename=path)
      print(url,res)
      return path
    except Exception as e:
      print('download img failed')
      print(e)
      return False

可以看到用了urllib这个库里面request.urlretrieve函数,这个函数是用来下载文件的,去看看python官网文档的函数说明,发现里面没有超时时间这个参数,所以是由于没有超时时间,导致一直在read,进而使得进程卡死。

urllib.request.urlretrieve(url, filename=None,reporthook=None,data=None)

解决方案

使用另一种方式来下载图片,使用支持超时时间的urlopen函数,封装成一个自定义的url_retrieve,这样就不再会出现没有超时导致的卡死问题了。

def url_retrieve(self,url, path):
    r = request.urlopen(url, timeout=5)
    res = False
    with open(path,"wb") as f:
      res = f.write(r.read())
      f.flush()
      f.close()
    return res

到此这篇关于使用py-spy解决scrapy卡死的问题方法的文章就介绍到这了,更多相关scrapy卡死内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python判断windows隐藏文件的方法
Mar 21 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
python逆向入门教程
Jan 15 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
python如何输出反斜杠
Jun 18 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
简述python Scrapy框架
Aug 17 Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
Python 如何实现数据库表结构同步
Sep 29 #Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 #Python
python ssh 执行shell命令的示例
Sep 29 #Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 #Python
浅析python 字典嵌套
Sep 29 #Python
You might like
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
Vue刷新修改页面中数据的方法
2018/09/16 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
vue实现购物车的监听
2020/04/20 Javascript
浅析Python中的join()方法的使用
2015/05/19 Python
Python 加密与解密小结
2018/12/06 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python——全排列数的生成方式
2020/02/26 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
硕士研究生个人求职信
2013/12/04 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
公司年会策划方案
2014/05/17 职场文书
企业宣传标语
2014/06/09 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
找规律教学反思
2016/02/23 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
python not运算符的实例用法
2021/06/30 Python
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL