PHP实现简单爬虫的方法


Posted in PHP onJuly 29, 2015

本文实例讲述了PHP实现简单爬虫的方法。分享给大家供大家参考。具体如下:

<?php
/**
 * 爬虫程序 -- 原型
 *
 * 从给定的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();
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php垃圾代码优化操作代码
Aug 05 PHP
php 伪静态之IIS篇
Jun 02 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
PHP获取文件行数的方法
Jun 10 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
实例讲解php实现多线程
Jan 27 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 PHP
php获取网站百度快照日期的方法
Jul 29 #PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 #PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 #PHP
PHP模拟QQ登录的方法
Jul 29 #PHP
PHP实现动态web服务器方法
Jul 29 #PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 #PHP
php简单防盗链实现方法
Jul 29 #PHP
You might like
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
解析预加载显示图片艺术
2016/12/05 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
中学生个人自我评价
2014/02/06 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
节水标语大全
2014/06/11 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
第二次离婚起诉书
2015/05/18 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
python小程序之飘落的银杏
2021/04/17 Python
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android