问题 获取HTML页面并将其存储在MYSQL中 - 如何


  • 将带有CSS的格式化html页面存储到MYSQL数据库的最佳方法是什么?可能吗?
  • 列类型应该是什么?如何检索存储的格式化HTML并使用PHP正确显示?

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

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

很多问题的人,但我真的需要你的帮助,让我以正确的方式去做。

非常感谢。


5965
2018-05-03 21:04


起源



答案:


很简单,试试我为您制作的代码。

这是在数据库中获取和保存源的基础知识。

我没有把错误处理或其他任何东西,只是暂时保持简单......

我没有让函数显示结果,但你可以打印$ 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);

?>

8
2018-05-04 18:06



非常感谢代码。我需要存储带有CSS和图片的格式化网页,所以当我回显它时,结果将是一个格式化的网页,就像原始网页一样。我不感谢上面的代码会这样做。如果我错了,请纠正我。 - codemaker
是的,它会自己尝试,使用:echo GetPage('google.com”);您将看到与谷歌相同的页面。如果这不是你想要的,我不明白你的要求...... - geek1983
抱歉,回复GetPage('google.com”); - geek1983
Grrr,http://和www。 :) - geek1983
谢谢,我打算试一试。 - codemaker


答案:


很简单,试试我为您制作的代码。

这是在数据库中获取和保存源的基础知识。

我没有把错误处理或其他任何东西,只是暂时保持简单......

我没有让函数显示结果,但你可以打印$ 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);

?>

8
2018-05-04 18:06



非常感谢代码。我需要存储带有CSS和图片的格式化网页,所以当我回显它时,结果将是一个格式化的网页,就像原始网页一样。我不感谢上面的代码会这样做。如果我错了,请纠正我。 - codemaker
是的,它会自己尝试,使用:echo GetPage('google.com”);您将看到与谷歌相同的页面。如果这不是你想要的,我不明白你的要求...... - geek1983
抱歉,回复GetPage('google.com”); - geek1983
Grrr,http://和www。 :) - geek1983
谢谢,我打算试一试。 - codemaker


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

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

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


1
2018-05-03 21:57



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


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

您可能想要查看可用的各种开源蜘蛛(想想htdig和httrack)。


1
2018-05-04 13:42





我将URL存储在数据库中,然后创建一个 cron 工作到 wget 页面定期,将它们存储在自己的键控本地目录中。运用 wget 将允许您缓存页面,并可选择缓存其图像,脚本等...你也可以 wget 命令更改嵌入的URL,以便您不必缓存所有内容。

这是wget的手册页,您也可以考虑搜索“wget备份网站”或类似内容。

(通过“键控目录”我的意思是你的数据库表将有2个字段,一个'key'和一个'url',[unique]'key'将是你将网站存档到使用的路径 wget。)


1
2018-05-04 17:58



为什么不,因为网页的URL非常小,我认为在文本或blob中保存页面内容没有问题。我相信从数据库中获取大约60KB左右的速度比本地硬盘更快。 - codemaker


您可以将数据存储为mysql中的text数据类型
但你必须转换数据bcz页面可能内容很多报价和特殊字符。
你可以看到这个问题 这个  它不是您的问题的确切,但它将有助于您将数据存储在数据库中。
关于那些图像和视频...如果你正在存储页面内容,那么将只有那些图像和视频的路径..所以当你将存储在数据库中时不会出现问题。


-1
2018-05-03 21:44



-1因为几乎不可读而且很大程度上是错误的。处理引号不需要“转换”数据,只需要执行将数据插入数据库的标准常规方法。此外,只要HTML从其原始URI移开,相对URI就会中断。 - Quentin
当你的数据与他们的样式和数据有很多引号...那么你会得到我的观点。我认为你的页面内容没有引号或没有样式表。主要是当您存储将由用户输入的数据时,您不知道他们将输入什么。所以,如果你不喜欢,那就没关系....如果你的数据只是由你输入,那么你将处理报价。当您触发查询时,引号会出现问题。 - Nitz