设为首页 收藏本站
查看: 369|回复: 0

[经验分享] PHP实现最简单爬虫原型

[复制链接]

尚未签到

发表于 2015-8-29 07:00:19 | 显示全部楼层 |阅读模式
  最简单的爬虫模型应该是这样的:给一个初始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这样的东西来模拟了。
  5、……略去2的N次方个汉字。
  反正是意思一下就好了~
  from http://blog.iyunv.com/bookmoth/archive/2009/02/21/3916538.aspx
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105649-1-1.html 上篇帖子: PHP-GD库-分类整理 下篇帖子: 转 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表