PHP實(shí)現(xiàn)簡單爬蟲的方法
本文實(shí)例講述了PHP實(shí)現(xiàn)簡單爬蟲的方法。分享給大家供大家參考。具體如下:
<?php
/**
* 爬蟲程序 -- 原型
*
* 從給定的url獲取html內(nèi)容
*
* @param string $url
* @return string
*/
function _getUrlContent($url) {
$handle = fopen($url, "r");
if ($handle) {
$content = stream_get_contents($handle, 1024 * 1024);
return $content;
} else {
return false;
}
}
/**
* 從html內(nèi)容中篩選鏈接
*
* @param string $web_content
* @return array
*/
function _filterUrl($web_content) {
$reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
$result = preg_match_all($reg_tag_a, $web_content, $match_result);
if ($result) {
return $match_result[1];
}
}
/**
* 修正相對路徑
*
* @param string $base_url
* @param array $url_list
* @return array
*/
function _reviseUrl($base_url, $url_list) {
$url_info = parse_url($base_url);
$base_url = $url_info["scheme"] . '://';
if ($url_info["user"] && $url_info["pass"]) {
$base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";
}
$base_url .= $url_info["host"];
if ($url_info["port"]) {
$base_url .= ":" . $url_info["port"];
}
$base_url .= $url_info["path"];
print_r($base_url);
if (is_array($url_list)) {
foreach ($url_list as $url_item) {
if (preg_match('/^http/', $url_item)) {
// 已經(jīng)是完整的url
$result[] = $url_item;
} else {
// 不完整的url
$real_url = $base_url . '/' . $url_item;
$result[] = $real_url;
}
}
return $result;
} else {
return;
}
}
/**
* 爬蟲
*
* @param string $url
* @return array
*/
function crawler($url) {
$content = _getUrlContent($url);
if ($content) {
$url_list = _reviseUrl($url, _filterUrl($content));
if ($url_list) {
return $url_list;
} else {
return ;
}
} else {
return ;
}
}
/**
* 測試用主程序
*/
function main() {
$current_url = "http://hao123.com/"; //初始url
$fp_puts = fopen("url.txt", "ab"); //記錄url列表
$fp_gets = fopen("url.txt", "r"); //保存url列表
do {
$result_url_arr = crawler($current_url);
if ($result_url_arr) {
foreach ($result_url_arr as $url) {
fputs($fp_puts, $url . "\r\n");
}
}
} while ($current_url = fgets($fp_gets, 1024)); //不斷獲得url
}
main();
?>
希望本文所述對大家的php程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP 存儲(chǔ)文本換行實(shí)現(xiàn)方法
在文本存儲(chǔ)時(shí)使用\n如果發(fā)現(xiàn)沒有效果, 這時(shí)可以使用\r\n就可以了,希望對有需要的朋友有所幫助。2010-01-01
php數(shù)組函數(shù)array_key_exists()小結(jié)
本文給大家匯總介紹了php數(shù)組函數(shù)array_key_exists()的相關(guān)知識(shí)以及與in_array的性能對比,與isset的區(qū)別分析,非常的詳細(xì),有需要的小伙伴可以參考下。2015-12-12
PHP創(chuàng)建文件,并向文件中寫入數(shù)據(jù),覆蓋,追加的實(shí)現(xiàn)代碼
這篇文章主要介紹了PHP創(chuàng)建文件,并向文件中寫入數(shù)據(jù),覆蓋,追加的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03
php偽協(xié)議實(shí)現(xiàn)命令執(zhí)行詳情
這篇文章主要介紹了php偽協(xié)議實(shí)現(xiàn)命令執(zhí)行詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,感興趣的朋友可以參考一下2022-06-06
PHP采用XML-RPC構(gòu)造Web Service實(shí)例教程
這篇文章主要介紹了PHP采用XML-RPC構(gòu)造Web Service,需要的朋友可以參考下2014-07-07
php基礎(chǔ)知識(shí):類與對象(2) 自動(dòng)加載對象
php基礎(chǔ)知識(shí):類與對象(2) 自動(dòng)加載對象...2006-12-12
PHP simple_html_dom.php+正則 采集文章代碼
網(wǎng)上也有很多人也在用PHP Simple Dom 雖然效率慢了點(diǎn),但效果還是不錯(cuò)的從包含類庫文件到寫入txt文件 大概是7/8就秒。2009-12-12
PHP中數(shù)據(jù)類型轉(zhuǎn)換的三種方式
這篇文章主要介紹了PHP中數(shù)據(jù)類型轉(zhuǎn)換的三種方式,本文講解了允許轉(zhuǎn)換的PHP數(shù)據(jù)類型、PHP數(shù)據(jù)類型的三種轉(zhuǎn)換方式等內(nèi)容,需要的朋友可以參考下2015-04-04

