∮Ω奧米加空間∮»PHP 交流區»【教學】利用 PHP 取得網頁 IP 內容並分析
| 作者 |
主題 |
dc
管理員

性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32 |
(第 1 篇) 【教學】利用 PHP 取得網頁 IP 內容並分析
感謝答客問的網友 mudong 提供的代碼 :)
我煩惱了兩天都想不出來 mudong 一下子就解決了~真是深藏不漏的高手 :)
程式會輸出三個檔,
一個是網頁ip列表,
一個是處理過的IP列表,
一個是目前無法處理的IP列表。
另外優先處理IP範圍是 0.0.0 - 255.255.255, 0.0-255.255, 0-255 三種。
整理一下,目前可以處理的IP 型式是以下幾種:
1.2.3.0 - 1.2.3.255 //123同,0-255結尾。
1.2.a.0 - 1.2.b.255 //12同,0-255結尾。
1.a.0.0 - 1.b.255.255 //1同,0.0-255.255結尾。
無法處理的也把它輸出為一個檔,方便再處理。
只是很剛好那個網站的IP範圍已經都分成以上三類,所以未處理列表剛好是空的。
自我測試時可以用本地檔案來測試,改一改網頁內容IP測試。
無法處理的類型如下: (有兩項不同的)
22.2.2.0 - 22.4.255.255
22.22.22.0 - 22.24.25.255
如果真碰到了,可能得手動幫它拆行了。
| 代碼: |
<?php
//韓國 IP 列表網頁
//$url="http://ipstat.nida.or.kr/korea_ip/korea_ip4_data.jsp";
$url="./korea_ip4_data.htm";
//要儲存的本地端檔案
$filename = './test.txt'; //處理後的IP列表
$filenameX = './testX.txt'; //未處理的IP列表
$filenameO = './testO.txt'; //網頁原始IP名單列表
//遠端開啟網頁
$content=file_get_contents($url);
//分析網頁格式
//從<tr>到<td>*.*.*.*</td> 取的IP範圍位置存入陣列 $title
preg_match_all("|<tr[^>]*>[\s\w\n\r]*<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>[\w\s\n\r]+<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>|U",$content,$title);
//循環取得 IP 位置,檢查列表
for ($i=0; $i<count($title[0]); $i++)
{
echo $title[1][$i]."".$title[2][$i]."\n";
}
//
$ipSt = $title[1];
$ipEd = $title[2];
//print_r ($ipSt);
//print_r ($ipEd);
//----
$iptotal = "";
$iptotalz = "";
$iptotalx = "";
for ($i=0; $i<count($ipSt); $i++)
{
$ips = split("\.", $ipSt[$i]);
$ipe = split("\.", $ipEd[$i]);
////優先處理 ?.0.0.0-255.255.255, 前一同.?.0.0-255.255, 前二同.?.0-255 三種
////0.0.0-255.255.255
if (($ips[1]==0)&&($ips[2]==0)&&($ips[3]==0)&&($ipe[1]==255)&&($ipe[2]==255)&&($ipe[3]==255))
{ $ips[1]="*"; $ips[2]="*"; $ips[3]="*";
$ipe[1]="*"; $ipe[2]="*"; $ipe[3]="*";
for ($j=$ips[0]; $j<=$ipe[0]; $j++)
{ $ips[0]=$j;
$iptotal .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////前一同.?.0.0-255.255 //只有第二位不同
else if (($ips[0]==$ipe[0])&&($ips[2]==0)&&($ips[3]==0)&&($ipe[2]==255)&&($ipe[3]==255))
{ $ips[2]="*"; $ips[3]="*";
$ipe[2]="*"; $ipe[3]="*";
for ($j=$ips[1]; $j<=$ipe[1]; $j++)
{ $ips[1]=$j;
$iptotal .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////前二同.?.0-255 //只有第三位不同
else if (($ips[0]==$ipe[0])&&($ips[1]==$ipe[1])&&($ips[3]==0)&&($ipe[3]==255))
{ $ips[3]="*";
$ipe[3]="*";
for ($j=$ips[2]; $j<=$ipe[2]; $j++)
{ $ips[2]=$j;
$iptotal .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////其它未處理的。
else {$iptotalx .= "$ipSt[$i]$ipEd[$i]\r\n";}
////for的結尾
}
echo "=====未處理列表 Start====\r\n";
print_r ($iptotalx);
echo "=====未處理列表 End =====\r\n";
//----------顯示在營幕上
//echo "====Start====\r\n";
//print_r ($iptotal);
//echo "=====End=====\r\n";
//
//存成檔案
//
$ipO = "";
foreach ($ipSt as $k => $v) { $ipO .= "$v$ipEd[$k]\r\n";}
$somecontentO = "$ipO"; //網頁原始IP名單列表
$somecontent = "$iptotal"; //處理後的IP列表
$somecontentX = "$iptotalx"; //未處理的IP列表
$handle = fopen ($filename, "w");
fwrite($handle, $somecontent);
fclose($handle);
$handle = fopen ($filenameX, "w");
fwrite($handle, $somecontentX);
fclose($handle);
$handle = fopen ($filenameO, "w");
fwrite($handle, $somecontentO);
fclose($handle);
?>
|
Your mind to my mind,
your thought to my thought |
| 發表時間:2008-09-24 21:00 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32 |
(第 2 篇) korea_ip4_data.htm
korea_ip4_data.htm
http://omega.idv.tw/doc/ip2star/korea_ip4_data.htm
網頁原始IP名單列表
http://omega.idv.tw/doc/ip2star/testO.txt
處理後的IP列表
http://omega.idv.tw/doc/ip2star/test.txt
未處理的IP列表
http://omega.idv.tw/doc/ip2star/testX.txt
本帖由dc最後編輯於2008-09-24 21:18
Your mind to my mind,
your thought to my thought |
| 發表時間:2008-09-24 21:11 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32 |
(第 3 篇)
舉例的韓國 IP4 配發網址已經變更為
https://ip.nida.kr/ip_cate_ipv4/ipv4_04_01.act
還有紀錄 IP 範圍的格式本來為
| 代碼: |
<tr align="center" bgcolor="ffffff">
<td>202.6.95.0</td>
<td>202.6.95.255</td>
<td> 1</td>
<td>1991.06.11.</td>
</tr>
|
現在變更為
| 代碼: |
<tr>
<td align="center">202.6.95.0</td>
<td background="../ip_img/pro_t_vline.gif"> </td>
<td align="center">202.6.95.255</td>
<td background="../ip_img/pro_t_vline.gif"> </td>
<td align="center">1</td>
<td background="../ip_img/pro_t_vline.gif"> </td>
<td align="center">19910611</td>
</tr>
|
多了一欄造成範例內的正規表達式無效,無法取得 IP 位置。
需變更成下列的正規表達式才有效
| 代碼: |
preg_match_all("|<tr[^>]*>[\s\w\n\r]*<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>[\b\d\s\w./<>;&=\"]+<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>|U",$content,$title);
|
用 IE 另存新檔把網頁存成 html 到本機分析會沒有資料~需使用 Firefox 另存新檔把網頁存成 html 到本機分析才行。
Your mind to my mind,
your thought to my thought |
| 發表時間:2009-04-03 17:28 |
|
|
所有時間均為GMT+8, 現在是2026-10-24 18:51 |
|