前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP实现网页URL爬虫

PHP实现网页URL爬虫

作者头像
素浅
发布2020-12-18 15:47:43
3K0
发布2020-12-18 15:47:43
举报
文章被收录于专栏:程序媛生涯程序媛生涯

爬虫一般是指网络爬虫。网络爬虫又称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网页URL爬虫是指爬取html网页上所有URL的爬虫。

实现URL爬虫

代码语言:javascript
复制
<?php 

class CrawlUrl{

  /**
   * 从给定的url获取html内容
   * @param string $url 
   * @return array 
   */
  public static function crawler($url) {
    $content = self::_getUrlContent($url);
    if ($content) {
      $url_list = self::_reviseUrl($url, self::_filterUrl($content));
      if ($url_list) {
        return $url_list;
      } else {
        return ;
      } 
    } else {
      return ;
    } 
  } 


  /**
   * 获取HTML内容
   * @param string $url 
   * @return string 
   */
  private static 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 
   */
  private static function _filterUrl($web_content) {
    $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
    // 在html内容中筛选出链接
    $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 
   */
  private static function _reviseUrl($base_url, $url_list) {
    /*
     * 解析 URL,返回其组成部分
     * http://username:password@hostname/path?arg=value#anchor
     * [scheme] => http
     * [host] => hostname
     * [user] => username
     * [pass] => password
     * [path] => /path
     * [query] => arg=value
     * [fragment] => anchor
    */
    $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"];
    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;
    } 
  } 

}

测试URL爬虫

获取网页上所有url

代码语言:javascript
复制
echo "<pre>";
$current_url = "https://www.cnblogs.com/shamohai/p/11158206.html"; //初始url
print_r($result_url_arr = CrawlUrl::crawler($current_url));

把获取到的url存放到txt文件中

代码语言:javascript
复制
// 记录url列表 只写方式打开 将文件指针指向文件末尾
$fp_puts = fopen("url.txt", "ab"); 
// 保存url列表 只读方式打开 将文件指针指向文件头
$fp_gets = fopen("url.txt", "r"); 
if ($result_url_arr) {
  foreach ($result_url_arr as $url) {
     // fwrite() 的别名
    fputs($fp_puts, $url . "\r\n");
  } 
} 

END

技术以内 | 技术以外

技术栈 | 小感悟

效率工具 | 必备技能

你的效率有多高,决定你能跑多快

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序媛生涯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现URL爬虫
  • 测试URL爬虫
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档