廣告

網友您好,若是您覺得我寫的工具或文章對您有幫助,
而您或者您的朋友有在博客來購物,可以透過底下連結

如何在博客來購物贊助網站或是點選計數器下方的博客來圖示來讓網站可以永續經營。

2007年5月14日 星期一

php如何抓取網站的內容,並解析其內容

如何抓取網站的內容,並解析其內容
<?php
$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顯示會換行    
      
 }
}
?>

48 則留言:

豆子 提到...

不好意思
我想向您請教一個問題

因為做實驗的關係
我必需對外產生大量的TCP封包
以觀測封包的特性

但又怕被對方的網站誤認我做不當的攻擊
所以,我將各家網站的連結放入陣列
希望寫for迴圈輪流開啟他們,避免持續的連結他們

$site[1]="http://www.ntnu.edu.tw";
$site[2]="http://tw.yahoo.com";
$site[3]="http://www.pchome.com.tw";
$site[4]="http://www.google.com.tw";
$site[5]="http://www.ibm.com";
$site[6]="http://www.hinet.net";




..............


但是開啟的方式不管我用fopen 、header 或是 stream_get_contents
都無法順利的達到我要的效果

因為用fopen 及 header 的方式 
在apache 上的log 都只會顯示以下的情況,並沒有辦法真正抓到內容

[09/Jun/2007:07:49:42 +0800] "GET / HTTP/1.0" 200 28943

甚至header的方法,網頁轉過去之後,就無法轉回來
其它的網址並無法繼續開啟連結

若是使用stream_get_contents的方法
則會在瀏覽器裡將所有的連結網頁內容開啟而造成overflow的情況



不知各位有什麼好的方法或是建議可供我參考嗎??!!

豆子 提到...

因為做實驗的關係
我必需對外產生大量的TCP封包
以觀測封包的特性

但又怕被對方的網站誤認我做不當的攻擊
所以,我將各家網站的連結放入陣列
希望寫for迴圈輪流開啟他們,避免持續的連結他們

$site[1]="http://www.ntnu.edu.tw";
$site[2]="http://tw.yahoo.com";
$site[3]="http://www.pchome.com.tw";
$site[4]="http://www.google.com.tw";
$site[5]="http://www.ibm.com";
$site[6]="http://www.hinet.net";




..............


但是開啟的方式不管我用fopen 、header 或是 stream_get_contents
都無法順利的達到我要的效果

因為用fopen 及 header 的方式 
在apache 上的log 都只會顯示以下的情況,並沒有辦法真正抓到內容

[09/Jun/2007:07:49:42 +0800] "GET / HTTP/1.0" 200 28943

甚至header的方法,網頁轉過去之後,就無法轉回來
其它的網址並無法繼續開啟連結

若是使用stream_get_contents的方法
則會在瀏覽器裡將所有的連結網頁內容開啟而造成overflow的情況



不知各位有什麼好的方法或是建議可供我參考嗎??!!

一整天 提到...

您可以試看看底下的方法看看

<html>
<head>
<META HTTP-EQUIV='refresh' CONTENT='5; URL=/272586.php'>
</head>
<body>
<?
$site[0]="http://272586.blogspot.com";
$site[1]="http://www.ntnu.edu.tw";
$site[2]="http://tw.yahoo.com";
$site[3]="http://www.pchome.com.tw";
$site[4]="http://www.google.com.tw";
$site[5]="http://www.ibm.com";
$site[6]="http://www.hinet.net";

$http=$site[mt_rand(0,6)];//您想抓取的網址

echo "Now read $http <br>";
?>
<iframe WIDTH=800 height=600 MARGINWIDTH=0 MARGINHEIGHT=0 HSPACE=0 VSPACE=0 FRAMEBORDER=0 SCROLLING=no SRC="<?=$http?>"></iframe>

</body>
</html>

豆子 提到...

哇賽
你實在是太厲害了
你寫的code真的解決我的問題了
完全就是我要的功能
感恩感恩~~~~

想變強 提到...

大大 你所發表的 抓取URL的內容
我用了之後 卻只能抓取一小段的內容
這是為什麼呢? 我指的內容就像飾 網路新聞那種內容 到底問題出在哪裡呢 ?

一整天 提到...

想變強您好:
你可以把您改過的程式張貼上來,我比較好知道到底是那裡出問題.

想變強 提到...

大大您好:
其實我也沒改什麼
只不過title變成p而已
當然 其他有title的 我都變成P
我不懂的是從URL的記事本裡面
運用P來抓取 卻只能抓最後一小段
所以 請大大幫忙解答
我跟我同學都是剛接觸PHP
我同學也曾改過 他的可以完全解取內容
不過 程式卻有問題 比方說 換成小說文章就不能抓取之類的
可是單方面擷取新聞的內容是可以的
程式碼不能貼出來
系統顯示您的
HTML 不被接受: PHP, ASP, and other server-side scripting is not allowed.
所以只能用口頭敘述 煩請大大告知 謝謝

一整天 提到...

想變強您好:
您可以把您的程式碼,透過
http://272586.blogspot.com/2007/07/html.html
將您的程式碼做一下轉換,再張貼就可以.如果還不會,把程式碼寄到imingho@gmail.com

想變強 提到...

大大 您回寄的 小弟我已經收到了
現在正在解析中 如果還有問題
應該會持續討教
先感謝大大了 真的非常謝謝

想變強 提到...

大大 我又來了 這次情況不同 所以想說你有沒有及時通訊之類的 用那種隨時請教 我想會比較方便 如果有 方便留一下 好嗎 ? 謝謝

一整天 提到...

想變強您好:
我平常很少在開msn跟即時通.所以有問題的話,可以透過imingho@gmail.com跟我連絡.

marks 提到...

大大你好~最近剛好碰到要用php~
無意中發現大大寫的剛好用的到!!
但是執行卻沒有顯示結果!!
請問大大我有可能是哪裡設定錯了~>"<~
我是用pspad寫的!!

一整天 提到...

marks您好:
pspad是編輯器,應該跟它沒關係,還是您把程式碼寄給我.我幫您看看..

吳豆豆 提到...
作者已經移除這則留言。
吳豆豆 提到...

我又來了
這次我遇到的問題是

如果我有一百個帳號
我想將這個一百個帳號的title做個列表
並使用fopen的方式去開啟
htt://xxx.xxx.xxx.xxx/底下的網頁
再用eregi
將title取出來

但是這一百個帳號裡不全都有index.htm之類的首頁
這麼一來fopen就會發生錯誤

不知有什麼方法可以先判斷該網址下
是否有首頁檔呢

因為根目錄下如果沒有首頁檔
不管是用fopen或是站老大用的$buffer = file($http);
都會出現錯誤
failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden

一整天 提到...

吳豆豆您好:
您試看看用底下的語法寫看看
$handle = @fopen('yourfile...', "r");
if ($handle) {
while (!feof($handle)) {
$lines[] = fgets($handle, 4096);
}
fclose($handle);
}

chfj 提到...

您好
因為最近要做研究
需要抓上千筆的網頁資料
然後存成文字檔
範例網址如下
http://etds.ncl.edu.tw/theabs/site/sh/detail_result.jsp?id=091CGU00396011
您可以告之 利用您的程式 我需要再如何修正呢
謝謝

一整天 提到...

cjfj您好:
您要儲存為文字檔的是那些資料,如果要抓的網頁有規則,則可以利用軟體flashget去抓取會比較簡單.

chfj 提到...

http://etds.ncl.edu.tw/theabs/extQuery/detail_result.jsp?id=094KNU00636024
例如這頁的資料有"出版年"
"研究生","研究生(英文姓名)","論文名稱","英文論文名稱","指導教授","參考文獻"等等,我需要抓上千篇的這些文字檔
這個flashget也可以做到嗎

一整天 提到...

chfj您好:
我這一支程式只可以一次抓一個網頁,因為您要上千筆網頁,這一支程式可能不適合您的需求,如果您己經知道您要抓取網址,可以透過flash get把網頁儲存在本機,再自己寫程式是解析裡面內容或是利用Excel匯入htm的方式,自己寫Excel的VBA來解決,這些方法的前題都是您本身要有寫程式的能力。

michael 提到...

您好:
小弟也順道請教您一個問題:
若要將某個網頁內含的超連結全部匯出到一個文字檔
, 請問該如何做呢? 非常感謝您!!

一整天 提到...

michael您好:
要取得網站的所有超連結,程式判斷的部分比較難寫,如果您只是單純的只要超連結,可以參考底下這一篇.
http://272586.blogspot.com/2010/06/excel.html
快速取得Excel中的網站超連結的網址及內容

兌珊 提到...

一整天您好:
我是第一次來這裡留言,不好意思,想冒昧的向您請教一些問題,

程式如下:

channel->item as $item) {
...
...
...
}
?>

問題:要如何將每天的及時新聞資料自動存入資料庫內,而不需要手動輸入??

連結資料庫的檔名:db.inc
設定的資料表為artcles,欄位有:aNo(編號欄位)、title(標題欄位)、content(內容欄位)

兌珊 提到...

為什麼我貼的程式沒辦法顯示???

一整天 提到...

兌珊您好:
我寫了一段寫入資料庫的程式.您修改完就可以使用.
http://272586.blogspot.com/2010/09/mysql.html

一整天 提到...

兌珊您好:
無法張貼程式碼原因請看
http://272586.blogspot.com/2007/07/html.html
如何在網頁上張貼html語法

正妹 提到...

我想請教一下,針對你文章提供的那語法


如果我要取2個以上網頁(數百個)的標題,不曉得網址那要如何修改??

一整天 提到...

正妹您好:
語法修改如下

<?
$n=$_GET[n];
if($n=='')
   $n=0;
$site[0]="http://272586.blogspot.com"; 
$site[1]="http://erium.blogspot.com/";
$site[2]="http://taium.blogspot.com/";
$http=$site[$n];//您想抓取的網址
   
   
$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顯示會換行     
       
 }
}
 if($n<count($site))
 {
    $n++;
    echo "<META HTTP-EQUIV='refresh' CONTENT='5; URL=?n=$n'>";
   
 }
echo $n."/".count($site);
?>

正妹 提到...

非常感謝大大的回覆

不過因為對php到完全陌生的地步,不曉得這段語法要如何執行才是。我放了100個網址,但上傳到網頁後,只出現 1/100 ....。上網查似乎和資料庫有關,不過查了很多,我還是不會,所以可能要再麻煩你幫個忙了,我應該把這段語法用什麼方式執行呢??

另外,我在網路上有看到vba excel 也抓得到網頁標題....所以試了一下,答案是可以的。但我找到的vb函數取不到動態式網頁的標題,而且對big5編寫的網頁會出現亂碼。看大大在此方面也是高手,所以順便問一下。

謝謝了

正妹 提到...
作者已經移除這則留言。
正妹 提到...
作者已經移除這則留言。
正妹 提到...

Function Title(ByVal url As String) As String
On Error Resume Next
Dim html As String
With CreateObject("Msxml2.XMLHTTP")
.Open "get", url, False
.send
html = .responsetext
If InStr(html, "charset=gbk") > 0 Then html = StrConv(.responsebody, vbUnicode, &H804)
Title = Split(Split(html, " *title* ", , vbTextCompare)(1), " */title* ", , vbTextCompare)(0)
End With
End Function

因為HTML 標記的關係這段函數一直貼不上來,所以我將原本的(大於符號)(小於符號)各換成*了

一整天 提到...

正妹您好:

我用了一個是自己blog是utf8的網站
跟另一個big5網站http://twmotel.com
都可以正常使用.
您用底下的程式碼試看看.

Private Sub CommandButton1_Click()
    Cells(1, 1) = Title("http://272586.blogspot.com")
    Cells(2, 1) = Title("http://twmotel.com")
End Sub
Function Title(ByVal url As String) As String
    On Error Resume Next
    Dim html As String
    With CreateObject("Msxml2.XMLHTTP")
    .Open "get", url, False
    .send
    html = .responsetext
    If InStr(html, "charset=big5") > 0 Then
        html = StrConv(.responsebody, vbUnicode, 1028)
    End If
    Title = Split(Split(html, "<title>", , vbTextCompare)(1), "</title>", , vbTextCompare)(0)
    End With
End Function

ps:程式碼要張貼可以參考我另一篇
http://272586.blogspot.com/2007/07/html.html
如何在網頁上張貼html語法

正妹 提到...

成功了....真是太感謝你了

問了好多人都得不到回覆,現在的心情就像是中樂透一樣開心...呵呵

yu_wendy266 提到...

你好!

想請問一下~
我有安裝套件wamp
然後必須要連結http://localhost/xxx.php才可開啟檔案
但是我複製貼上大大的code
網頁上只有把所有code印出
想請教一下是什麼問題呢
(自己有試過寫別的php是ok可以在網頁上看到東西的)

謝謝!!

yu_wendy266 提到...

yu_wendy266 提到...

你好:

想請問一下~
我有安裝套件wamp
然後必須要連結http://localhost/xxx.php才可開啟檔案
但是我複製貼上大大的code
網頁上只有把所有code印出
想請教一下是什麼問題呢
(自己有試過寫別的php是ok可以在網頁上看到東西的)

謝謝!!

yu_wendy266 提到...

你好:

想請問一下~
我有安裝套件wamp
然後必須要連結http://localhost/xxx.php才可開啟檔案
但是我複製貼上大大的code
網頁上只有把所有code印出
想請教一下是什麼問題呢
(自己有試過寫別的php是ok可以在網頁上看到東西的)

謝謝!!

一整天 提到...

yu_wendy266您好:
方便抓圖並把程式碼寄給我(imingho@gmail.com)我再幫您看看是什麼問題造成.

NewDays 提到...

不好意思 我有問題想請問一下
因為專題需要
我需要能夠自動KEY IN 資料到指定網頁的格子裡 然後再抓取跑出來的資料
這裡提到的程式碼適用嗎
自動KEY IN的部分 會很困難嗎

一整天 提到...

NewDays您好:
這支程式只可以抓透過網址傳參數的網站.

NewDays 提到...

那我說的方法有辦法透過PHP程式完成嗎? 因為做專題所以有需要~ 謝謝一整天

一整天 提到...

NewDays您好:
很抱歉,這支程式沒辦法做到您要的功能.

古肇喻 提到...
作者已經移除這則留言。
古肇喻 提到...

您好我是PHP初學者
然後剛剛用了大大的code可以輕鬆的抓出網頁的一些資料 p title 都可以

但是我是想要抓取郵政上面路名的資料
請問這個code可以抓取 option的value嗎?

想請問該怎麼處理呢?

非常謝謝您

一整天 提到...

古肇喻您好,
您可以檢視網頁原始碼,找出惟一的規則就可以抓到,通常規則都是下拉式選單的名稱,找到名稱就可以把後面的 option抓出來.再分別解析內容可以.

陳萱翰 提到...

版主您好:

您真的寫的很詳細

我本身是php的初學者

想請問您關於php剖析網頁的問題

我利用您的程式,再自行在後面加了判斷式後 發現php檔案無法執行

我多加了剖析其他資料的判斷是,但是就無法跑出接下來有剖析的資料了

還想請問您,如果要將網頁上的圖片,一起剖析出來並且顯示的話

也能用剖析文字一樣的方式嗎?

Unknown 提到...

同學$title=iconv("UTF-8","big5",$title); 轉碼註解掉

贊助

彰化一整天粉絲團

About Me

我的相片

很多人問我為什麼叫"一整天",其實這是有原故的.有一天看一本書.就是說如何介紹自己.裡面說到如何讓別人對你的名字有印象.就要讓別人跟你的名字或是身體的一些特徵有關.比如很胖.就會被別人取小胖或是胖子.或是跟名字有關的諧音,那天看布袋戲中有一個叫”一頁書”的角色.所以我就想我的名字.可以想出什麼字出來.結果我把我的名字"明和",拆成日月和,日月和在一起,就代表白天晚上都在一起.就取名為"一整天",而這個"一整天"跟我的名字有關也方便別人記憶,後來發現"一整天"這個名詞太常被用,所以就在"一整天"前面加上"彰化"變成"彰化一整天",為什麼要加彰化.因為我老家在彰化,所以以後別人要找我的部落格的話.我都會跟他們說,請到yahoo或是google打"彰化一整天"第一筆出現的就是我的Blog. PS:現在只要輸入"一整天"可以找到.

Google+ Followers