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 购物车实例(申精)
May 11 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
初品cakephp 入门基础
Feb 16 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
教大家制作简单的php日历
Nov 17 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
Laravel 实现密码重置功能
Feb 23 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分页思路以及在ZF中的使用
2012/05/30 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
utf8的编码算法 转载
2006/12/27 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
Javascript 二维数组
2009/11/26 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
2017/07/28 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
干部行政关系介绍信
2014/01/17 职场文书
护士在校生自荐信
2014/02/01 职场文书
应聘教师求职信
2014/07/19 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
公司年会主持词范文!
2019/05/07 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电