php单线程爬虫类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php单线程爬虫类相关的知识,希望对你有一定的参考价值。
- 代码:
/** * @desc:单线程爬虫类 * @author [Lee] <[<[email protected]>]> * @property * 1、callcontent 获取给定url页面中的内容的回调函数 * 2、calltodo 处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库 * @method * run 执行爬虫程序 * @param depth 深度 默认2 * @return void */ class crawl{ public $callcontent = ‘getcontent‘; # 获取给定url页面中的内容的回调函数 public $calltodo = ‘todo‘; # 处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库 private $url; # 内部属性:当前处理中的url /* @desc:内部方法,调用回调函数获取页面内容 @param url 传入到回调函数的参数 @return ret 页面内容 */ private function getcontent($url){ $callback = $this->callcontent; $ret = call_user_func($callback,$url); return $ret; } /* @desc:内部方法,调用回调函数进行业务处理 @param content 传入到回调函数的参数 */ private function todo($content){ $callback = $this->calltodo; call_user_func($callback,$content); } /* @desc:内部方法,获取页面中的超链接 @param content 页面内容 @return urls 获取到的超链接 */ private function geturl($content){ $preg = ‘/<[a|A].*?href=[\‘\"]{0,1}([^>\‘\"\ ]*).*?>/‘; $bool = preg_match_all($preg,$content,$res); $urls = array(); if($bool){ $urls = $res[1]; } $urls = array_unique($urls); return $urls; } /* @desc:内部方法,修复不完整的url @param url 原始url @param url 修复好的url */ private function reviseurl($url){ $info = parse_url($url); $scheme = $info["scheme"]?:‘http‘; $user = $info["user"]; $pass = $info["pass"]; $host = $info["host"]; $port = $info["port"]; $path = $info["path"]; $url = $scheme . ‘://‘; if ($user && $pass) { $url .= $user . ":" . $pass . "@"; } $url .= $host; if ($port) { $url .= ":" . $port; } $url .= $path; return $url; } /* @desc:构造方法,初始化url */ public function __construct($url){ $this->url = $url; } /* @desc:主方法,执行程序 @param depth 挖掘深度 默认2 */ public function run($depth = 2){ $url = $this->url; if($depth > 0){ $depth--; $content = $this->getcontent($url); // 业务处理开始 $this->todo($content); // 业务处理结束 $urls = $this->geturl($content); $url = $this->reviseurl($url); if (is_array($urls) && !empty($urls)) { foreach ($urls as $u) { if (preg_match(‘/^http/‘, $u)) { $returl = $u; } else { $real = $url . ‘/‘ . $u; $returl = $real; } $crawl = new crawl($returl); $crawl->run($depth); } } } } }
- 测试:
$crawl = new crawl(‘www.baidu.com‘); $crawl->run(); /* @desc:获取内容的回调 */ function getcontent($url){ $http = new http($url); $ret = $http->get()->run(); return $ret; } /* @desc:处理业务逻辑的回调 */ function todo($content){ echo ‘执行内容‘.php_EOL; }
- 输出:
执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容 执行内容
以上是关于php单线程爬虫类的主要内容,如果未能解决你的问题,请参考以下文章
python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片
通过网络图片小爬虫对比Python中单线程与多线(进)程的效率