获取HTML页面并将其存储在MYSQL中如何
- 将CSS格式化的HTML页面存储到MYSQL数据库的最佳方式是什么?可能吗?
列类型应该是什么?如何检索存储的格式化HTML并使用PHP正确显示它?获取HTML页面并将其存储在MYSQL中如何
如果我想抓取页面有图片和视频,展示我保存页面为BLOB
什么是使用PHP卷曲抓取网页,FOPEN,..-最好的方法是什么?
许多问题的家伙,但我真的需要你的帮助,让我在正确的方式做到这一点。
非常感谢。
非常简单,试试我为你制作的这段代码。
这是获取和保存数据库中的源代码的基础知识。
我没有把错误处理或什么别的,只是保持简单的时刻...
我没做的函数来显示结果,但您可以打印$源查看结果。
希望这会帮助你。
<?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);
?>
您可以将数据存储为mysql中的文本数据类型
但您必须转换数据bcz页面可能会包含许多引号和特殊字符。
你可以看到这个问题THIS它不完全符合你的问题,但它会帮助你将数据存储在数据库中。
关于该图像和视频...如果您正在存储页面内容,那么将只有该图像和视频的路径..因此,当您将存储在数据库中时不会出现问题。
使用fopen拉下整个页面并解析出任何URL(如图像和css)。你会想要运行一个循环来抓取每个URL来生成页面的文件。同样保存这些内容,并将用于链接到其他网站文件的网址替换为新链接。 (如果将来文件应该改变或被删除,这将避免任何问题)。
我推荐使用blob数据类型只是因为它可以将所有文件存储在一个表中,但是您可以为具有文本数据类型的页面和使用blob存储图像和其他文件的页面创建表格。
编辑: 如果您将blob数据类型存储在base64_encode()中,它将增加服务器上的存储空间,但您将避免使用引号和特殊字符的任何问题。
如果我错了,请纠正我,你建议分两步解析页面。首先没有链接到CSS和图像,其次是链接。我的问题是,除了整体思考之外,我应该如何将其存储在一个blob中,然后用正确的formaat检索并显示它?你能解释一下吗? – codemaker 2010-05-03 22:32:21
无法将整个页面保存为一个文件。您需要收集页面内的链接(CSS,JavaScript,图像等)。然后在本地打开并保存这些文件。很多链接都是相对的,修改它们让fopen可以打开这些文件。一旦这些文件已保存在本地,请将html中的链接更改为您的本地链接。你还必须检查任何JavaScript和CSS的链接,并重复这些文件的过程。 〜我假设你正在使用它从其他站点翻页(类似于http://www.archive.org/),而不是用它来存储本地创建的模板。 – Mestore 2010-05-04 00:23:54
你知道在PHP中实现快速的HTML解析器来完成任务吗? – codemaker 2010-05-04 12:08:39
不要使用关系数据库来存储文件。使用文件系统或NoSQL解决方案。
你可能想看看各种可用的开源蜘蛛(htdig和httrack浮现在脑海中)。
我会将这些URL存储在一个数据库中,并定期制作一个cron
作业到wget
这些页面,并将它们存储在它们自己的键控本地目录中。使用wget
将允许您缓存页面,并可选择缓存其图像,脚本等等。您也可以让您的wget
命令更改嵌入的URL,以便不必缓存所有内容。
Here is the man page for wget,您可能还会考虑搜索“wget备份网站”或类似内容。 (通过“keyed directories”我的意思是说你的数据库表有两个字段,一个'key'和一个'url',那么[unique]'key'就会成为你存档网站使用的路径wget
。)
为什么不能,因为网页的网页尺寸非常小,所以在将文本内容保存为文本或Blob时没有问题。我相信从数据库读取60KB左右的数据将比本地硬盘更快。 – codemaker 2010-05-04 19:01:45
非常感谢代码。我需要用CSS和图片存储一个格式化的网页,所以当我回应它时,结果将是一个格式化的网页,就像原始网页一样。我不感谢上面的代码会这样做。如果我错了,请纠正我。 – codemaker 2010-05-04 19:08:50
是的,它会自己尝试,使用:echo GetPage('http://www.google.com'); 您将看到与google相同的页面。 如果这不是你想要的,我不明白你的要求... – geek1983 2010-05-04 19:34:35
对不起,echo GetPage('http://www.google.com'); – geek1983 2010-05-04 19:35:27