TShopping

 找回密碼
 註冊
搜索
查看: 10590|回復: 0
打印 上一主題 下一主題

[教學] PHP 如何抓取網頁內容及分析

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2013-7-11 22:34:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
有些網頁的內容是常常變動的,但是又不可能一直盯著看,所以研究看看怎麼用 PHP 抓取網頁內容。
http://272586.blogspot.com/2007/05/php.html
http://www.fantxi.com/blog/show-618-1.html
http://www.inote.tw/2009/04/php-curl.html

譯者:limodou
抓取和分析一個文件是非常簡單的事。這個教程將通過一個例子帶領你一步一步地去實現它。讓我們開始吧!
首先,首先必須決定我們將抓取的URL地址。可以通過在腳本中設定或通過$QUERY_STRING傳遞。為了簡單起見,讓我們將變量直接設在腳本中。
  1. <?
  2. $url = 'http://www.php.net';
  3. ?>
複製代碼

第二步,我們抓取指定文件,並且通過file()函數將它存在一個數組裡。
  1. <?
  2. $url = 'http://www.php.net';
  3. $lines_array = file($url);
  4. ?>
複製代碼

好了,現在在數組裡已經有了文件了。但是,我們想分析的文本可能不全在一行裡面。為瞭解決這個文件,我們可以簡單地將數組$lines_array轉化成一個字符串。我們可以使用implode(x,y)函數來實現它。如果在後面你想用explode(將字符串變量數組),將x設成"|"或"!"或其它類似的分隔符可能會更好。但是出於我們的目的,最好將x設成空格。y是另一個必要的參數,因為它是你想用implode()處理的數組。
  1. <?
  2. $url = 'http://www.php.net';
  3. $lines_array = file($url);
  4. $lines_string = implode('', $lines_array);
  5. ?>
複製代碼

現在,抓取工作就做完了,下面該進行分析了。出於這個例子的目的,我們想得在<head>到</head>之間的所有東西。為了分析出字符串,我們還需要叫做正規表達式的東西。
  1. <? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); ?>
複製代碼

讓我們看一下代碼。正如你所見,eregi()函數按下面的格式執行:

  1. eregi("<head>(.*)</head>", $lines_string, $head);
複製代碼

"(.*)"表示所有東西,可以解釋為,"分析在<head>和</head>間的所以東西"。$lines_string是我們正在分析的字符串,$head是分析後的結果存放的數組。
最後,我們可以輸數據。因為僅在<head>和</head>間存在一個實例,我們可以安全的假設數組中僅存在著一個元素,而且就是我們想要的。讓我們把它打印出來吧。
  1. <?
  2. $url = 'http://www.php.net';
  3. $lines_array = file($url);
  4. $lines_string = implode('', $lines_array);
  5. eregi("<head>(.*)</head>", $lines_string, $head);
  6. echo $head[0];
  7. ?>
複製代碼

轉自WeberDev.com
如何抓取網站的內容,並解析其內容
  1. <?
  2. $http="http://272586.blogspot.com"; //您想抓取的網址
  3. $buffer = file($http); //將網址讀入buffer變數
  4. for($i=0;$i<sizeof($buffer);$i++) //將每段文字讀出來,以換行為單位,sizeof會傳回共有幾筆
  5. {
  6. $n1=strpos(" ".$buffer[$i],"<title>"); //檢查你要找的字,是否存在,假設我想找<title>中的內容為何,為什麼前面要加空白,因為如果找到位置如果是第一個位置是0,0跟找不到在判斷會有問題
  7. if($n1>0)
  8. {
  9. $n2=strrpos($buffer[$i],"</title>"); //找出</title>的位置
  10. $title=substr($buffer[$i],$n1+6,$n2-$n1-6); //+6的意思是<title>的長度減掉前面的一個空白,-6的話是把長度減掉
  11. //utf-8 轉 big5
  12. $title=iconv("UTF-8","big5",$title);
  13. echo $title."<br>n"; //將title的內容值印出n代表顯示原始碼的時候會換行,<BR>是brower顯示會換行}
  14. }
  15. ?>
複製代碼

PHP抓網頁內容
1.file_get_contents
  1. <?
  2. $url = http://www.xxx.com/;
  3. $contents = file_get_contents($url);
  4. //如果出現中文亂碼使用下面代碼
  5. //$getcontent = iconv("gb2312", "utf-8",file_get_contents($url));
  6. //echo $getcontent;
  7. echo $contents;
  8. ?>
複製代碼

2.curl
我們必須先建立一個「curl」的連線,也因此,必須使用到「$ch = curl_init()」這個函式。而為了怕建立連線忘了關閉。因此,必須先寫好關閉的函式,「curl_close($ch)」。
接下來,你可以設定他截取網頁的選項,一般來說常用的有「CURLOPT_RETURNTRANSFER」、「CURLOPT_URL」、「CURLOPT_HEADER」、「CURLOPT_FOLLOWLOCATION」、「CURLOPT_USERAGENT」這幾個選項。而這幾個選項分別代表「將結果回傳成字串」、「設定截取網址」、 「是否截取header的資訊」、「是否抓取轉址」及「瀏覽器的user agent」。最後,再執行「curl_exec($ch)」以取出結果就可以了。
  1. <?
  2. $url = "http://www.xxx.com/";
  3. $ch = curl_init();
  4. $timeout = 5;
  5. curl_setopt($ch, CURLOPT_URL, $url);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  8. //在需要用戶檢測的網頁裡需要增加下面兩行
  9. //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
  10. //curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);
  11. $contents = curl_exec($ch);
  12. curl_close($ch);
  13. echo $contents;
  14. ?>
複製代碼

以抓取yahoo為例,若我們要偽裝成google bot去抓取,那麼我們可以寫成下列的樣子:
  1. $ch = curl_init();
  2. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  3. curl_setopt($ch, CURLOPT_URL, "www.yahoo.com.tw");
  4. curl_setopt($ch, CURLOPT_HEADER, false);
  5. curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
  6. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  7. $output = curl_exec($ch);
  8. curl_close($ch);
  9. echo $output;
複製代碼

也可以將選項們設定一個陣列,以增加設定時的閱讀度。這時就得動用「curl_setopt_array()」這個函式了:

  1. $ch = curl_init();
  2. $options = array(CURLOPT_URL => 'www.yahoo.com.tw',
  3.                  CURLOPT_HEADER => false,
  4.    CURLOPT_RETURNTRANSFER => true,
  5.    CURLOPT_USERAGENT => "Google Bot",
  6.    CURLOPT_FOLLOWLOCATION => true
  7.            );
  8. curl_setopt_array($ch, $options);
  9. $output = curl_exec($ch);
  10. curl_close($ch);
  11. echo $output;
複製代碼

3.fopen->fread->fclose
  1. <?
  2. $handle = fopen ("http://www.xxx.com/", "rb");
  3. $contents = "";
  4. do {
  5.    $data = fread($handle, 8192);
  6.    if (strlen($data) == 0) {
  7.    break;
  8.    }
  9.    $contents .= $data;
  10. } while(true);
  11. fclose ($handle);
  12. echo $contents;
  13. ?>
複製代碼


 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-26 09:20 , Processed in 0.064640 second(s), 20 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表