有些網頁的內容是常常變動的,但是又不可能一直盯著看,所以研究看看怎麼用 PHP 抓取網頁內容。
From:http://my.opera.com/kmgocc/blog/show.dml/322416
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傳遞。為了簡單起見,讓我們將變量直接設在腳本中。
<? $url = 'http://www.php.net'; ?>
第二步,我們抓取指定文件,並且通過file()函數將它存在一個數組裡。
<? $url = 'http://www.php.net'; $lines_array = file($url); ?>
好了,現在在數組裡已經有了文件了。但是,我們想分析的文本可能不全在一行裡面。為瞭解決這個文件,我們可以簡單地將數組$lines_array轉化成一個字符串。我們可以使用implode(x,y)函數來實現它。如果在後面你想用explode(將字符串變量數組),將x設成"|"或"!"或其它類似的分隔符可能會更好。但是出於我們的目的,最好將x設成空格。y是另一個必要的參數,因為它是你想用implode()處理的數組。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); ?>
現在,抓取工作就做完了,下面該進行分析了。出於這個例子的目的,我們想得在<head>到</head>之間的所有東西。為了分析出字符串,我們還需要叫做正規表達式的東西。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); ?>
讓我們看一下代碼。正如你所見,eregi()函數按下面的格式執行:
eregi("<head>(.*)</head>", $lines_string, $head);
"(.*)"表示所有東西,可以解釋為,"分析在<head>和</head>間的所以東西"。$lines_string是我們正在分析的字符串,$head是分析後的結果存放的數組。
最後,我們可以輸數據。因為僅在<head>和</head>間存在一個實例,我們可以安全的假設數組中僅存在著一個元素,而且就是我們想要的。讓我們把它打印出來吧。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); echo $head[0]; ?>
轉自WeberDev.com
如何抓取網站的內容,並解析其內容
<? $http="http://272586.blogspot.com"; //您想抓取的網址 $buffer = file($http); //將網址讀入buffer變數 for($i=0;$i<sizeof($buffer);$i++) //將每段文字讀出來,以換行為單位,sizeof會傳回共有幾筆 { $n1=strpos(" ".$buffer[$i],"<title>"); //檢查你要找的字,是否存在,假設我想找<title>中的內容為何,為什麼前面要加空白,因為如果找到位置如果是第一個位置是0,0跟找不到在判斷會有問題 if($n1>0) { $n2=strrpos($buffer[$i],"</title>"); //找出</title>的位置 $title=substr($buffer[$i],$n1+6,$n2-$n1-6); //+6的意思是<title>的長度減掉前面的一個空白,-6的話是把長度減掉 //utf-8 轉 big5 $title=iconv("UTF-8","big5",$title); echo $title."<br>n"; //將title的內容值印出n代表顯示原始碼的時候會換行,<BR>是brower顯示會換行} } ?>
PHP抓網頁內容
1.file_get_contents
<? $url = http://www.xxx.com/; $contents = file_get_contents($url); //如果出現中文亂碼使用下面代碼 //$getcontent = iconv("gb2312", "utf-8",file_get_contents($url)); //echo $getcontent; echo $contents; ?>
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)」以取出結果就可以了。
<? $url = "http://www.xxx.com/"; $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //在需要用戶檢測的網頁裡需要增加下面兩行 //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); //curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD); $contents = curl_exec($ch); curl_close($ch); echo $contents; ?>
以抓取yahoo為例,若我們要偽裝成google bot去抓取,那麼我們可以寫成下列的樣子:
$ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, "www.yahoo.com.tw"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $output = curl_exec($ch); curl_close($ch); echo $output;
也可以將選項們設定一個陣列,以增加設定時的閱讀度。這時就得動用「curl_setopt_array()」這個函式了:
$ch = curl_init(); $options = array(CURLOPT_URL => 'www.yahoo.com.tw', CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_USERAGENT => "Google Bot", CURLOPT_FOLLOWLOCATION => true ); curl_setopt_array($ch, $options); $output = curl_exec($ch); curl_close($ch); echo $output;
3.fopen->fread->fclose
<? $handle = fopen ("http://www.xxx.com/", "rb"); $contents = ""; do { $data = fread($handle, 8192); if (strlen($data) == 0) { break; } $contents .= $data; } while(true); fclose ($handle); echo $contents; ?>
一整天您好:
我是第一次來這裡留言,不好意思,想冒昧的向您請教一些問題,
程式如下:
YAHOO即時新聞網
channel->item as $item) {
echo '';
echo '';
echo 'link.'" target="info">'.$item->title.'';
}
?>
問題:要如何將每天的及時新聞資料自動存入資料庫內,而不需要手動輸入??
連結資料庫的檔名:db.inc
設定的資料表為artcles,欄位有:aNo(編號欄位)、title(標題欄位)、content(內容欄位)
真的非常抱歉,開錯網頁留錯言了
:orz
感謝提供這個程式碼, 好用!
另外想請問, 以下的網站卻為何無法被讀取, 是不是有另外的好法子去讀到它, 感謝啦!
http://xml.utrace.de/?query=88.198.156.18
可以耶~我的程式碼:
$http6 = "http://xml.utrace.de/?query=88.198.156.18";
$buffer6 = file($http6);
for($b=0;$b
輸出的結果是:
0:<?xml version="1.0" encoding="iso-8859-1"?>
1:<results>
2:<result>
3:<ip>88.198.156.18</ip>
4:<host></host>
5:<isp>Hetzner Online AG</isp>
6:<org>Pagedesign GmbH Agentur f▒r digitale Medien</org>
7:<region></region>
8:<countrycode>DE</countrycode>
9:<latitude>51</latitude>
10:<longitude>9</longitude>
11:<queries>2</queries>
12:</result>
13:</results>
您好:現在新網頁的內容是常常變動AJAX,但是又不可能一直盯著看,是否有辦法自動抓取網頁AJAX (JQUERY)內容 ?
不好意思,我沒有抓取過 AJAX 的網頁!
請問如果抓取前須要打入帳號密碼要怎麼做呢?
謝謝!
可以 goggle:php curl login
DaniWeb 的範例:
function cURL($url, $header=NULL, $cookie=NULL, $post=NULL)
{
//$user_agent = $_SERVER['HTTP_USER_AGENT'];
$user_agent = 'Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_NOBODY, $header);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if ($post) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$result = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if($result){
return $result;
}else{
return $error;
}
}
function curl_fb($url){
//輸入要用來登入的e-mail與密碼
$EMAIL = "";
$PASSWORD = "";
$fb_login_url = "https://login.facebook.com/login.php?login_attempt=1";
$result = cURL($fb_login_url,true,null,"email=$EMAIL&pass=$PASSWORD");
preg_match('%Set-Cookie: ([^;]+);%',$result,$M);
$result = cURL($fb_login_url,true,$M[1],"email=$EMAIL&pass=$PASSWORD");
preg_match_all('%Set-Cookie: ([^;]+);%',$result,$M);
$cookie = '';
for($i=0;$i
謝謝您!!
假日我試看看~
若卡關在向您請教!!
您好:
可否請你幫忙寫一個網頁表格抓取程式
把抓取的表格內容存入excel檔
如http://www.abc.com/????
?號是遞增的數字
可手動輸入決定?號的數字,如自1-100或800-999或1000-3000等
釣竿在上面有耶~您不自己試看看嗎?
(加個 for 迴圈就可以抓取 遞增數字了)
我的建議是輸出成表格後,自己 copy 到 Excel 比較簡單
我不會用程式直接輸出 Excel 檔。我會選擇輸出 CSV 檔,後面用 VBA 來處理。
您好 我想抓取這個網頁的資料(http://richurimo.51240.com/24.026396666017327_120.849609375_20131008__richuriluo/)
星期二 日出 日中 日落
2013年10月08日 05:51:06 11:44:08 17:37:09
我想抓出日出 日落的時間
但是他原始碼非常的繁雜
不知道抓取的關鍵字要怎麼設定呢?之類的
因為有很多重複!! 但有些資料是不需要的
能請求您給個提示媽?
您好,您可以參考 http://article.denniswave.com/5198 這篇文章來把您要的資料取出來
(我會用 "如何抓取網站的內容,並解析其內容" 那一段程式配合 正規表示式 (Regular Expression) 取出特定的時間)
不好意思
我測試了 在我的網站上無法執行耶 可否找您協助一下呢
登入FACEBOOK 沒問題的
錯誤訊息是什麼啊?
登入沒有問題,應該就可以抓取資料的。
怕的只是裡面放了一些 iframe 或是 script 導致抓取的網頁內容不是您在瀏覽器看到的內容。
( echo curl_fb($url); 應該就會呈現抓取到的網頁內容)
對不起
方便宜過去看一下嗎? 或是我直接可以MAIL 相關資料給您
http://forum.pfsense.org/index.php/topic,68038.0.html
這個狀況應該是有密碼特殊字元 發生這個問題
不過當我把密碼修改能沒有特殊字元 就變成
CSRF check failed. Either your session has expired, this page has been inactive too long, or you need to enable cookies.
Debug:
備註: 密碼一定需要特殊字元 所以這個問題也必須被解決
謝謝您
特殊字元的問題,可以試看看加個 反斜線 (\)。
另外,可能是因為要設定 Cookie 吧。這個我就沒有經驗了,抱歉!>"<