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 相关文章推荐
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
在PHP中养成7个面向对象的好习惯
Jul 17 PHP
PHP与C#分别格式化文件大小的代码
May 14 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
PHP解压ZIP文件到指定文件夹的方法
Nov 17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
详解php的socket通信
2015/08/11 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
javascript验证身份证号
2015/03/03 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
js实现微博发布小功能
2017/01/12 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python threading模块操作多线程介绍
2015/04/08 Python
Python自动扫雷实现方法
2015/07/25 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
激励口号大全
2014/06/17 职场文书
国企干部对照检查材料
2014/08/22 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python