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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
PHP解析RSS的方法
Mar 05 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
PHP rsa加密解密使用方法
Apr 27 PHP
纯php生成随机密码
Oct 30 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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学习之PHP变量
2006/10/09 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
Django与JS交互的示例代码
2017/08/23 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python七夕浪漫表白源码
2019/04/05 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
技术总监管理职责范本
2014/03/06 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
中标通知书
2015/04/17 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
Golang的继承模拟实例
2021/06/30 Golang
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏