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 删除无限级目录与文件代码共享
Nov 22 PHP
php学习之数据类型之间的转换代码
May 29 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
PHP中使用php://input处理相同name值的表单数据
Feb 03 PHP
PHP实现算式验证码和汉字验证码实例
Mar 09 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php获取网页请求状态程序示例
2014/06/17 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
javascript学习网址备忘
2007/05/29 Javascript
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
Djang中静态文件配置方法
2015/07/30 Python
python清理子进程机制剖析
2017/11/23 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
python中shell执行知识点
2020/05/06 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
工地安全生产标语
2014/06/06 职场文书
农村文化建设标语
2014/10/07 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
文明旅游倡议书
2015/04/28 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis