使用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读写Redis数据库操作示例
Mar 18 Python
Python编写一个闹钟功能
Jul 11 Python
Python实现随机选择元素功能
Sep 14 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
Apr 05 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
python字典的元素访问实例详解
Jul 21 Python
Python绘画好看的星空图
Mar 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中常用数组处理方法实例分析
2008/08/30 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
js对象的复制继承实例
2015/01/10 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python滑块验证码的破解实现
2019/11/10 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
python str字符串转uuid实例
2020/03/03 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
学校法制宣传月活动总结
2014/07/03 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
公司与个人合作协议书
2016/03/19 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
Golang生成Excel文档的方法步骤
2021/06/09 Golang
分析Netty直接内存原理及应用
2021/06/14 Java/Android
Mysql忘记密码解决方法
2022/02/12 MySQL