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之第一天
Oct 09 PHP
利用PHP制作简单的内容采集器的代码
Nov 28 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
编写安全 PHP应用程序的七个习惯深入分析
Jun 08 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
php计算数组相同值出现次数的代码(array_count_values)
Jan 20 PHP
php实现的通用图片处理类
Mar 24 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
Javascript window对象详解
2014/11/12 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
python对json的相关操作实例详解
2017/01/04 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python实现远程控制电脑
2019/05/23 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
Python dict的常用方法示例代码
2020/06/23 Python
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
学校门卫岗位职责范本
2014/06/30 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫
Redis实现一个账号只能登录一个设备
2022/04/19 Redis
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技