如何在python爬虫中节省存储空间(常用字符串)

How to save storage in python crawler (common strings)

我有一个 python3 爬虫可以连接到目标站点并保存所有 html 和资源。虽然我在保存之前用 gzip 压缩它消耗了太多 space,而且我通常在不到一半的网站页面被抓取之前达到我配置的 space 限制。

关键是同一网站的所有页面都有很多共同的字符串(甚至有网站在所有 html 页面中包含 css 这样的资源,而不是然后链接)。然后我的想法是为同一个网站保存通用字符串。我以为这种优化会被记录下来,但我没有找到任何相关信息。

虽然有这个想法,但是不知道怎么实现这种算法。任何帮助将不胜感激。

您可以只保存页面 或为每个网站创建特定的解决方案并只保存相关内容。

对于这两种解决方案,您都可以使用 BeautifulSoup 作为答案,

这是一个简短的示例,说明如何从包含页面 html(未压缩)

的变量中仅获取正文
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
# Download the page
response = requests.get("http://www.google.com")
variable_with_site_html = response.content
# Choose only the page body
soup = BeautifulSoup(variable_with_site_html, "html.parser")
page_body = soup.body

普通压缩算法已经可以在普通字符串上节省很多 space,如果您有来自同一网站的页面,这将是一个很好的例子。不要单独保存和压缩页面,而是尝试将相似的页面放在同一个文件中并进行压缩。它应该使压缩率更好。

您应该尝试使压缩的 window 大小大于平均页面大小,以便它利用以前页面的数据。

如果你将它们保存到磁盘或使用数据库,你可以使用域名或 URL 的前 X 个字符作为索引来查找压缩文件,因此相同 domain/directory自然会被压缩在一起


您可以采用的另一种方法是为您的压缩创建“字典”。一些压缩算法允许你给出一些示例文件来训练一个字典,然后可以用来更好地压缩类似的文件。执行此操作的算法示例是 zstd. You can read how to use the dictionary feature here.

您可以尝试下载所有 html 个页面,其中包含单个 CSS 个文件,并将它们压缩在一起。类似于以下 zip 文件结构:

whosebug.com.zip
    /home.html
    /questions.html
    /tags.html
    /users.html

    /cdn-static/
        cdn.sstatic.net__Sites__Whosebug__Img__favicon.ico
        cdn.sstatic.net__Sites__Whosebug__primary.css
        cdn.sstatic.net__Shared__stacks.css

您也可以单独存储部分页面。例如,我相信 HTML head 的大部分对于所有页面来说几乎都是一样的,并且可以包含大量的内联脚本或内联样式。您可以使用 BeautifulSoup4 库进行 HTML 解析,然后比较 HTML 页面的部分内容。