【问题标题】:How to save storage in python crawler (common strings)如何在python爬虫中保存存储(常用字符串)
【发布时间】:2021-01-25 05:46:47
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要获取 CSS 之类的资源?我的意思是,HTML 足以获取数据。我已经爬取了超过 15K 的 HTML 页面,每个 HTML 页面只有 100-200KB
  • 否则,为爬虫做一个检查点对于连续处理来说并不是一个坏主意
  • @TấnNguyên 通常它们并不重,但我见过一些超过 1.5MB。我需要 css 来获取我也想抓取的主要背景图像。
  • 如果您只需要 css 来处理一些事情,将它们解析出来并仅存储相关位比压缩或重复匹配更有帮助。
  • 你试过xz压缩吗?有时它比gzip好得多

标签: python python-3.x optimization web-crawler


【解决方案1】:

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

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

如果你将它们保存到磁盘或使用数据库,你可以使用域名或 URL 的前 X 个字符作为索引来查找压缩文件,这样同域/目录下的页面自然会被压缩在一起。


您可以采取的另一种方法是为您的压缩创建“字典”。一些压缩算法允许您提供一些示例文件来训练字典,然后可以使用该字典更好地压缩类似文件。执行此操作的算法示例是zstd。您可以阅读如何使用字典功能here

【讨论】:

    【解决方案2】:

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

    stackoverflow.com.zip
        /home.html
        /questions.html
        /tags.html
        /users.html
    
        /cdn-static/
            cdn.sstatic.net__Sites__stackoverflow__Img__favicon.ico
            cdn.sstatic.net__Sites__stackoverflow__primary.css
            cdn.sstatic.net__Shared__stacks.css
    

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

    【讨论】:

      【解决方案3】:

      您可以只保存页面

      ,也可以为每个网站创建一个特定的解决方案并只保存相关内容。

      对于这两种解决方案,您都可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多