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中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
Jun 12 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
php文件系统处理方法小结
May 23 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
PHP中Trait及其应用详解
Feb 14 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 PHP
PHP实现简易用户登录系统
Jul 10 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
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
分享一个简单的python读写文件脚本
2017/11/25 Python
python爬取m3u8连接的视频
2018/02/28 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
python文本数据处理学习笔记详解
2019/06/17 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
详解Python中namedtuple的使用
2020/04/27 Python
python能做哪方面的工作
2020/06/15 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
环境科学毕业生自荐信
2013/11/21 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
如何写自我鉴定
2014/03/19 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL