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 面向对象实现代码
Nov 11 PHP
php数字转汉字代码(算法)
Oct 08 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 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
ftp类(example.php)
2006/10/09 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
python中装饰器级连的使用方法示例
2017/09/29 Python
python多进程实现进程间通信实例
2017/11/24 Python
解决Python一行输出不显示的问题
2018/12/03 Python
python的debug实用工具 pdb详解
2019/07/12 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
python 调试冷知识(小结)
2019/11/11 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
劳动实践课感言
2014/02/01 职场文书
致共产党员倡议书
2014/04/16 职场文书
文明寝室申报材料
2014/05/12 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书