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 相关文章推荐
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
小程序实现多选框功能
2018/10/30 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
Python从MP3文件获取id3的方法
2015/06/15 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
python实现发送邮件
2021/03/02 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
成考报名单位证明范本
2014/01/16 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
工会工作个人总结
2015/03/03 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
PyQt5实现多张图片显示并滚动
2021/06/11 Python