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 分页类 扩展代码
Jun 11 PHP
PHP实现定时执行任务的方法
Oct 05 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
Nov 22 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
Laravel实现短信注册的示例代码
May 29 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
PHP针对redis常用操作实例详解
Aug 17 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
德生PL330的评价与改造
2021/03/02 无线电
关于文本留言本的分页代码
2006/10/09 PHP
PHP产生随机字符串函数
2006/12/06 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
javascript常用方法汇总
2014/12/02 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
python虚拟环境模块venv使用及示例
2020/03/04 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
父亲的菜园教学反思
2014/02/13 职场文书
常务副总经理任命书
2014/06/05 职场文书
室内趣味活动方案
2014/08/24 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
Elasticsearch 数据类型及管理
2022/04/19 Python