2010-05-03 124 views
11
  • 将CSS格式化的HTML页面存储到MYSQL数据库的最佳方式是什么?可能吗?
  • 列类型应该是什么?如何检索存储的格式化HTML并使用PHP正确显示它?获取HTML页面并将其存储在MYSQL中如何

  • 如果我想抓取页面有图片和视频,展示我保存页面为BLOB

  • 什么是使用PHP卷曲抓取网页,FOPEN,..-最好的方法是什么?

许多问题的家伙,但我真的需要你的帮助,让我在正确的方式做到这一点。

非常感谢。

回答

7

非常简单,试试我为你制作的这段代码。

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

我没有把错误处理或什么别的,只是保持简单的时刻...

我没做的函数来显示结果,但您可以打印$源查看结果。

希望这会帮助你。

<?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); 

?> 
+0

非常感谢代码。我需要用CSS和图片存储一个格式化的网页,所以当我回应它时,结果将是一个格式化的网页,就像原始网页一样。我不感谢上面的代码会这样做。如果我错了,请纠正我。 – codemaker 2010-05-04 19:08:50

+0

是的,它会自己尝试,使用:echo GetPage('http://www.google.com'); 您将看到与google相同的页面。 如果这不是你想要的,我不明白你的要求... – geek1983 2010-05-04 19:34:35

+0

对不起,echo GetPage('http://www.google.com'); – geek1983 2010-05-04 19:35:27

-2

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

+0

-1由于大部分不可读且很大程度上是错误的。处理引号并不要求数据被“转换”,只需要执行将数据插入数据库的标准常规方法。此外,只要HTML从原始URI移开,相对URI就会中断。 – Quentin 2010-05-03 21:55:12

+0

当你有他们的样式和数据与许多引号数据...那么你会明白我的观点。我认为你的页面内容没有引号或没有样式表。主要是当你存储了用户输入的数据时,你不知道他们会输入什么。 所以如果你不喜欢,那么它确定.... 如果你的数据只输入你然后你会照顾报价。 引号会在您触发查询时出现问题。 – Nitz 2010-05-04 03:50:49

1

使用fopen拉下整个页面并解析出任何URL(如图像和css)。你会想要运行一个循环来抓取每个URL来生成页面的文件。同样保存这些内容,并将用于链接到其他网站文件的网址替换为新链接。 (如果将来文件应该改变或被删除,这将避免任何问题)。

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

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

+0

如果我错了,请纠正我,你建议分两步解析页面。首先没有链接到CSS和图像,其次是链接。我的问题是,除了整体思考之外,我应该如何将其存储在一个blob中,然后用正确的formaat检索并显示它?你能解释一下吗? – codemaker 2010-05-03 22:32:21

+0

无法将整个页面保存为一个文件。您需要收集页面内的链接(CSS,JavaScript,图像等)。然后在本地打开并保存这些文件。很多链接都是相对的,修改它们让fopen可以打开这些文件。一旦这些文件已保存在本地,请将html中的链接更改为您的本地链接。你还必须检查任何JavaScript和CSS的链接,并重复这些文件的过程。 〜我假设你正在使用它从其他站点翻页(类似于http://www.archive.org/),而不是用它来存储本地创建的模板。 – Mestore 2010-05-04 00:23:54

+0

你知道在PHP中实现快速的HTML解析器来完成任务吗? – codemaker 2010-05-04 12:08:39

1

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

你可能想看看各种可用的开源蜘蛛(htdig和httrack浮现在脑海中)。

1

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

Here is the man page for wget,您可能还会考虑搜索“wget备份网站”或类似内容。 (通过“keyed directories”我的意思是说你的数据库表有两个字段,一个'key'和一个'url',那么[unique]'key'就会成为你存档网站使用的路径wget。)

+0

为什么不能,因为网页的网页尺寸非常小,所以在将文本内容保存为文本或Blob时没有问题。我相信从数据库读取60KB左右的数据将比本地硬盘更快。 – codemaker 2010-05-04 19:01:45

相关问题