【问题标题】:Fetch HTML page and store it in MYSQL- How to获取 HTML 页面并将其存储在 MYSQL- 如何
【发布时间】:2011-02-15 05:08:02
【问题描述】:
  • 将带有 CSS 的格式化 html 页面存储到 MYSQL 数据库的最佳方式是什么?可能吗?
  • 列类型应该是什么?如何检索存储的格式化 HTML 并使用 PHP 正确显示?

  • 如果我要获取的页面有图片和视频怎么办,显示我将页面存储为 blob

  • 使用 PHP-CURL、fopen、..- 获取页面的最佳方法是什么?

伙计们有很多问题,但我真的需要你的帮助才能让我走上正确的道路。

非常感谢。

【问题讨论】:

    标签: php mysql html


    【解决方案1】:

    很简单,试试我为你做的这段代码。

    这是获取源代码并将其保存在数据库中的基础知识。

    我没有放错误处理或其他什么,只是暂时保持简单......

    我没有做显示结果的函数,但是你可以打印$source来查看结果。

    希望这会对你有所帮助。

    <?php
    
    function GetPage($URL)
    {
        #Get the source content of the URL
        $source = file_get_contents($URL);
    
        #Extract the raw URl from the current one
        $scheme = parse_url($URL, PHP_URL_SCHEME); //Ex: http
        $host = parse_url($URL, PHP_URL_HOST); //Ex: www.google.com
        $raw_url = $scheme . '://' . $host; //Ex: http://www.google.com
    
        #Replace the relative link by an absolute one
        $relative = array();
        $absolute = array();
    
        #String to search
        $relative[0] = '/src="\//';
        $relative[1] = '/href="\//';
    
        #String to remplace by
        $absolute[0] = 'src="' . $raw_url . '/';
        $absolute[1] = 'href="' . $raw_url . '/';
    
        $source = preg_replace($relative, $absolute, $source); //Ex: src="/image/google.png" to src="http://www.google.com/image/google.png"
    
        return $source;
    }
    
    function SaveToDB($source)
    {
        #Connect to the DB
        $db = mysql_connect('localhost', 'root', '');
    
        #Select the DB name
        mysql_select_db('test');
    
        #Ask for UTF-8 encoding
        mysql_query("SET NAMES 'utf8'");
    
        #Escape special chars
        $source = mysql_real_escape_string($source);
    
        #Set the Query
        $query = "INSERT INTO website (source) VALUES ('$source')"; //Save it in a text row, that's it...
    
        #Run the query
        mysql_query($query);
    
        #Close the connection
        mysql_close($db);
    }
    
    $source = GetPage('http://www.google.com');
    
    SaveToDB($source);
    
    ?>
    

    【讨论】:

    • 非常感谢您的代码。我需要用 CSS 和图片存储一个格式化的网页,所以当我回显它时,结果将是一个与原始网页一样的格式化网页。我不感谢上面的代码会这样做。如果我错了,请纠正我。
    • 会的,自己试试,使用:echo GetPage('google.com');您将看到与 google 相同的页面。如果这不是你想要的,我不明白你的要求......
    • 谢谢,我去试试。
    【解决方案2】:

    使用 fopen 拉下整个页面并解析出任何 URL(如图像和 css)。您需要运行一个循环来获取生成页面的文件的每个 url。也存储这些,并用您的新链接替换用于链接到其他站点文件的 url。 (这将避免将来更改或删除文件时出现任何问题)。

    我建议使用 blob 数据类型,因为它允许您将所有文件存储在一个表中,但您可以为具有文本数据类型的页面和另一个具有 blob 的页面创建一个表来存储图像和其他文件。

    编辑: 如果您将存储为 blob 数据类型,请查看 base64_encode() 它将增加服务器上的存储空间,但您可以避免引号和特殊字符的任何问题。

    【讨论】:

    • 如果我错了请纠正我,您建议分两步解析页面。首先没有指向 css 和图像的链接,其次是链接。我的问题是我应该如何整体思考并将其存储在一个 blob 中,然后以正确的格式检索并显示它?你能解释一下吗?
    • 您不能将整个页面保存为一个文件。您需要收集页面内的链接(css、javascript、图像等)然后打开并在本地保存这些文件。很多链接都是相对的,修改它们以便 fopen 可以打开文件。将这些文件保存在本地后,将 html 中的链接更改为您的本地链接。您还必须检查任何 javascript 和 css 的链接以及对这些文件重复该过程。 ~我假设你正在使用它来从其他站点(类似于archive.org)中抓取页面,而不是使用它来存储本地创建的模板。
    • 你知道用 PHP 实现的快速 HTML 解析器来完成任务吗?
    • 我从未使用过它,但我相信sourceforge.net/projects/simplehtmldom 相当容易设置,并且应该允许您更改 html 以满足您的需要。那里有很多解析器,一个快速的谷歌查询会找到其中的大部分。
    【解决方案3】:

    不要使用关系数据库来存储文件。使用文件系统或 NoSQL 解决方案。

    您可能想了解各种可用的开源蜘蛛(想到 htdig 和 httrack)。

    【讨论】:

      【解决方案4】:

      我会将 URL 存储在数据库中,并定期为 wget 页面创建 cron 作业,并将它们存储在它们自己的键控本地目录中。使用wget 将允许您缓存页面,并且还可以选择缓存其图像、脚本等……。您还可以让 wget 命令更改嵌入的 URL,这样您就不必缓存所有内容。

      Here is the man page for wget,你也可以考虑搜索“wget backup website”之类的。

      (通过“键控目录”,我的意思是您的数据库表将有 2 个字段,一个“键”和一个“URL”,然后 [唯一]“键”将是您使用 @ 存档网站的路径987654326@.)

      【讨论】:

      • 为什么不呢,因为网页的 URL 非常小,我认为将页面内容保存在文本或 blob 中没有问题。我相信从数据库中获取 60KB 左右的数据会比本地硬盘更快。
      【解决方案5】:

      您可以将数据存储为 mysql 中的文本数据类型
      但是您必须转换数据 bcz 页面可能包含许多引号和特殊字符。
      你可以看到这个问题THIS它并不完全符合你的问题,但是当你将数据存储在数据库中时它会有所帮助。
      关于该图像和视频...如果您正在存储页面内容,那么将只有该图像和视频的路径..所以当您存储在数据库中时不会出现问题。

      【讨论】:

      • -1 几乎不可读且很大程度上是错误的。处理引号不需要“转换”数据,只需执行将数据插入数据库的标准常规方法。此外,一旦 HTML 从其原始 URI 移开,相对 URI 就会中断。
      • 当您拥有带有样式的数据和带有许多引号的数据时......那么您就会明白我的意思。我认为您的页面内容没有引号或样式表。大多数情况下,当您存储将由用户输入的数据时,您不知道他们将输入什么。因此,如果您不喜欢,那没关系....如果您的数据仅由您输入,那么您将负责报价。当您触发查询时,引号会出现问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多