您的位置:首页 > 编程语言 > PHP开发

PHP实现最简单爬虫原型

2016-03-22 15:01 716 查看

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235

最简单的爬虫模型应该是这样的:给一个初始url,爬虫把内容扒下拉,找页面里的url,在以这些url为起点,开始爬。

下面是一个最简单的php实现的爬虫模型。

<?php

/**

* 爬虫程序 -- 原型

*

* BookMoth 2009-02-21

*/

/**

* 从给定的url获取html内容

*

* @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内容中筛选链接

*

* @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)){

//已经是完整的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();

?>

当然这只爬虫还需要进行下面的进化才可以:

1、拼接更准确的url链接。现在的链接有可能是格式错误的。

2、能够去掉重复的url链接。现在的爬虫会做非常多非常多的重复工作。

3、避免爬虫怕成环路,一个永远右转的车,只能是300内环,它只会跑在三环路上,去不了别的地方。

4、多线程或者多进程。因为php没有线程的概念,所以可能需要shell这样的东西来模拟了。

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: