利用py-spy定位并解决Scrapy爬虫进程卡死问题

星野
星野
发布时间:2026-10-14| 4人浏览过
原创

本文介绍如何使用py-spy工具排查Scrapy爬虫因网络IO导致的进程卡死问题。通过定位耗时函数发现urllib.urlretrieve缺乏超时参数,进而封装支持timeout的urlopen方法,有效解决爬虫进程堆积和数据延迟问题。

背景与问题现象

背景

在使用Scrapy进行数据采集时,通常通过crontab定时启动爬虫任务。然而实践中常遇到机器上堆积大量处于僵死状态的Scrapy进程。若长时间不干预,可能导致十余个进程同时卡死,进而引发数据产出严重延迟。

问题定位

使用py-spy定位性能瓶颈

为解决此类性能瓶颈,引入py-spy这一高效的Python性能分析工具。该工具功能类似于Unix下的top命令,能够实时监控Python进程的函数调用耗时。通过它我们可以观察是哪个具体函数在持续占用资源。

首先安装这个工具


pip install py-spy

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


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

在py-spy界面中,按下数字键3,按OwnTime(函数自身执行时间)进行排序。结果显示read函数的执行时间最长,这表明问题很可能源于IO操作。程序中的IO行为主要涉及磁盘读写和网络IO,鉴于磁盘读写通常较为稳定,初步判断为网络IO阻塞所致。


为进一步确认,再次按下数字键4,按TotalTime(所有子函数执行时间总和)进行排序。结果显示process_item、download以及upload_image等主流程函数耗时较长。分析业务逻辑可知,这些函数涉及将图片下载至本地并上传至图床的过程。由此推断,问题出在从网络读取数据(read)的阶段,需进一步追踪相关代码。


代码分析与问题根因

看下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官方文档可知,该函数并未提供超时时间(timeout)参数。由于缺乏超时机制,当网络响应缓慢或中断时,程序会无限期等待read操作,从而导致进程卡死。


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

解决方案与代码实现

解决方案

改用支持超时设置的urlopen函数来替代原有的下载方式。通过封装一个自定义的url_retrieve函数,显式指定timeout参数(例如5秒),从而避免因无超时限制导致的进程阻塞问题。


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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。