各位大佬们,我最近在学习 Python 爬虫,遇到个奇怪的问题。我在处理大量数据时,程序运行一段时间后会突然卡死,排查发现可能是内存泄漏。代码里用到 requests 和 BeautifulSoup ,但怎么检查也找不出问题所在。有没有熟悉这方面的老司机能指点迷津?附上部分关键代码:
def fetch_data(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
data = soup.find_all('div', class_='data-element')
return data
# 无限循环爬取
while True:
data_list = fetch_data('http://xxx.com')
process_data(data_list)
如果是我理解错了,请纠正。感激不尽!
![]() |
1
TeslaM3 OP 怎么无人!
|
![]() |
2
ZhaiSoul 51 天前
Python 再怎么慢,你这个 while 循环一直爬取……也过分了点吧,你没有进行周期等待的话,每秒可能执行上万次,GC 都还没来得及你就已经炸了
|
![]() |
5
ClericPy 51 天前 ![]() 突然卡死你是怎么定位出内存泄漏这个类别的。。。
Requests 这个库当年确实会有各种问题,很早年有个 session cache 相关的死锁还是什么会卡住一直不继续,后来还遇到过 session 、Response 没正确关闭导致的类似泄漏的情况,所以长时间运行的基本都不用默认 requests 发请求,而是一直 with session 和 with Response 信息太少,只能提供思路: 1. Python 有很多进程运行时工具可以看出你 hang 在哪一行的,先定位下是哪一行再直接撸 Requests 源码找细节。反正就是先看是哪一行停住了 2. 升级 Requests 库,或者换 httpx ,反正 api 都一样的,看看能复现没有 3. 你这个 Requests 但凡加个 Timeout ,也能让别人排除一个问题,有时候 TCP 操作不当或者 Server 写的不行,确实会挂住连接 |
7
lLuO0WljRTqf 51 天前
requests 连接的时候我记得有个 timeout 的参数。
另外,爬取时请加延时。你访问那么快,如何保证对方网站不禁你 ip 一段时间呢? |
![]() |
8
wang93wei 46 天前
我在处理大量数据时,程序运行一段时间后会突然卡死,排查发现可能是内存泄漏。
你的 process_data 呢?为啥会觉得 fetch_data 会出问题? |