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将数据导入到Foxmail的实现代码
Sep 05 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
PHP切割汉字的常用方法实例总结
Apr 27 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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生成xml时添加CDATA标签的方法
2014/10/17 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Python实现的tcp端口检测操作示例
2018/07/24 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
ORACLE第二个十问
2013/12/14 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
大学生入党思想汇报
2014/01/14 职场文书
学习雷锋活动总结
2014/04/29 职场文书
大专生求职信
2014/06/29 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
庭外和解协议书
2016/03/23 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技