PHPCrawl爬虫库实现抓取酷狗歌单的方法示例


Posted in PHP onDecember 21, 2017

本文实例讲述了PHPCrawl爬虫库实现抓取酷狗歌单的方法。分享给大家供大家参考,具体如下:

本人看了网络爬虫相关的视频后,手痒痒,想爬点什么。最近Facebook上表情包大战很激烈,就想着把所有表情包都爬下来,却一时没有找到合适的VPN,因此把酷狗最近一月精选歌曲和简单介绍抓取到本地。代码写得有点乱,自己不是很满意,并不想放上来丢人现眼。不过转念一想,这好歹是自己第一次爬虫,于是...就有了如下不堪入目的代码~~~(由于抓取的数据量较小,所以没有考虑多进程什么的,不过我看了一下PHPCrawl的文档,发现PHPCrawl库已经把我能想到的功能都封装好了,实现起来很方便)

<?php
header("Content-type:text/html;charset=utf-8");
// It may take a whils to crawl a site ...
set_time_limit(10000);
include("libs/PHPCrawler.class.php");
class MyCrawler extends PHPCrawler {
  function handleDocumentInfo($DocInfo) {
    // Just detect linebreak for output ("\n" in CLI-mode, otherwise "<br>").
    if (PHP_SAPI == "cli") $lb = "\n";
    else $lb = "<br />";
    $url = $DocInfo->url;
    $pat = "/http:\/\/www\.kugou\.com\/yy\/special\/single\/\d+\.html/";
    if(preg_match($pat,$url) > 0){
    $this->parseSonglist($DocInfo);
    }
    flush();
  }
  public function parseSonglist($DocInfo){
    $content = $DocInfo->content;
    $songlistArr = array();
    $songlistArr['raw_url'] = $DocInfo->url;
    //解析歌曲介绍
    $matches = array();
    $pat = "/<span>名称:<\/span>([^(<br)]+)<br/";
    $ret = preg_match($pat,$content,$matches);
    if($ret>0){
      $songlistArr['title'] = $matches[1];
    }else{
      $songlistArr['title'] = '';
    }
    //解析歌曲
    $pat = "/<a title=\"([^\"]+)\" hidefocus=\"/";
    $matches = array();
    preg_match_all($pat,$content,$matches);
    $songlistArr['songs'] = array();
    for($i = 0;$i < count($matches[0]);$i++){
      $song_title = $matches[1][$i];
      array_push($songlistArr['songs'],array('title'=>$song_title));
    }
    echo "<pre>";
    print_r($songlistArr);
    echo "</pre>";
    }
  }
$crawler = new MyCrawler();
// URL to crawl
$start_url="http://www.kugou.com/yy/special/index/1-0-2.html";
$crawler->setURL($start_url);
// Only receive content of files with content-type "text/html"
$crawler->addContentTypeReceiveRule("#text/html#");
//链接扩展
$crawler->addURLFollowRule("#http://www\.kugou\.com/yy/special/single/\d+\.html$# i");
$crawler->addURLFollowRule("#http://www.kugou\.com/yy/special/index/\d+-\d+-2\.html$# i");
// Store and send cookie-data like a browser does
$crawler->enableCookieHandling(true);
// Set the traffic-limit to 1 MB(1000 * 1024) (in bytes,
// for testing we dont want to "suck" the whole site)
//爬取大小无限制
$crawler->setTrafficLimit(0);
// Thats enough, now here we go
$crawler->go();
// At the end, after the process is finished, we print a short
// report (see method getProcessReport() for more information)
$report = $crawler->getProcessReport();
if (PHP_SAPI == "cli") $lb = "\n";
else $lb = "<br />";
echo "Summary:".$lb;
echo "Links followed: ".$report->links_followed.$lb;
echo "Documents received: ".$report->files_received.$lb;
echo "Bytes received: ".$report->bytes_received." bytes".$lb;
echo "Process runtime: ".$report->process_runtime." sec".$lb; 
?>
PHP 相关文章推荐
PHP 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
PHP 5.0对象模型深度探索之属性和方法
Mar 27 PHP
开源SNS系统-ThinkSNS
May 18 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
使用正则去除php代码中的注释方法
Nov 03 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 #PHP
php获取微信共享收货地址的方法
Dec 21 #PHP
php实现socket推送技术的示例
Dec 20 #PHP
PHP实现模拟http请求的方法分析
Dec 20 #PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 #PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 #PHP
PHP实现的最大正向匹配算法示例
Dec 19 #PHP
You might like
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
PHP 身份证号验证函数
2009/05/07 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
javascript数组去重小结
2016/03/07 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python super函数使用方法详解
2020/02/14 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
数控专业大学生的自我鉴定
2013/11/13 职场文书
文秘专业个人求职信
2013/12/22 职场文书
护士自我介绍信
2014/01/13 职场文书
大学生军训感想
2014/02/16 职场文书
2014年个人委托书范本
2014/10/13 职场文书
走群众路线学习笔记
2014/11/06 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
MySQL分布式恢复进阶
2022/07/23 MySQL
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技