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 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
下载文件的点击数回填
Oct 09 PHP
PHP 数组基础知识小结
Aug 20 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
php 伪静态之IIS篇
Jun 02 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
php中mkdir()函数的权限问题分析
Sep 24 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
华为python面试题
2016/05/03 面试题
党建示范点实施方案
2014/03/12 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
自主招生自荐信范文
2015/03/04 职场文书
公司员工辞职信范文
2015/05/12 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书