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中进行身份认证
Oct 09 PHP
PHP中的正规表达式(一)
Oct 09 PHP
Discuz板块横排显示图片的实现方法
May 28 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
如何在PHP中生成随机数
Jun 04 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 Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
理解JavaScript中的对象 推荐
2011/01/09 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Django 前后台的数据传递的方法
2017/08/08 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
深入了解Django中间件及其方法
2019/07/26 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
django model object序列化实例
2020/03/13 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
逻辑链路控制协议
2016/10/01 面试题
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
校长岗位职责
2013/11/26 职场文书
面料业务员岗位职责
2013/12/26 职场文书
企业标语大全
2014/07/01 职场文书
房屋维修协议书范本
2014/09/25 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
大学生入党自传2015
2015/06/26 职场文书
开学第一周总结
2015/07/16 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python