2010-05-03 168 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

相關問題