python - 使用 BeautifulSoup 和 Requests 解析 html 页面源时出现内存泄漏
问题描述
因此,基本思想是通过使用 beautifulsoup 删除 HTML 标记和脚本,对某些列表 URL 发出 get 请求并解析来自这些页面源的文本。蟒蛇版本2.7
问题是,在每个请求中,解析器函数都会在每个请求中不断添加内存。规模逐渐增大。
def get_text_from_page_source(page_source):
soup = BeautifulSoup(open(page_source),'html.parser')
# soup = BeautifulSoup(page_source,"lxml")
# kill all script and style elements
for script in soup(["script", "style"]):
script.decompose() # rip it out
# get text
text = soup.get_text()
# break into lines and remove leading and trailing space on each
lines = (line.strip() for line in text.splitlines())
# break multi-headlines into a line each
chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
# drop blank lines
text = '\n'.join(chunk for chunk in chunks if chunk)
# print text
return text
即使在用于解析内存泄漏的本地文本文件中。例如:
#request 1
response = requests.get(url,timeout=timeout)
parsed_string_from_html_source = get_text_from_page_source(response.content) #100 MB
#request 2
response = requests.get(url,timeout=timeout)
parsed_string_from_html_source = get_text_from_page_source(response.content) #150 MB
#request 3
response = requests.get(url,timeout=timeout)
parsed_string_from_html_source = get_text_from_page_source(response.content) #300 MB
解决方案
您可以尝试调用垃圾收集器:
import gc
response.close()
response = None
gc.collect()
这也可能对您有所帮助:Python high memory usage with BeautifulSoup
推荐阅读
- node.js - 猫鼬 startSession() 挂起
- flutter - 相机无法在颤动中检测到中等分辨率的人脸
- blockchain - 在 TomoChain 节点中创建交易时出现“仅支持使用 ipc 发送交易”错误
- php - 按年、月、周和日分组数据
- c# - 为什么我通过 SendGrid 发送的邮件在我发送的项目中不可见?(.net 核心)
- python - 如何使用return返回一个值
- locale - NixOS:如何精细配置区域设置?
- javascript - 导入 ECMAScript 6 时出现“未捕获的语法错误:无法在模块外使用 import 语句”
- javascript - JavaScript 猜词游戏问题:一旦按下字母键,同一个字母不会多次填充
- javascript - 如何监听来自 vuex 的计算数组的变化