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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
php的一些小问题
Jul 03 PHP
简单的php缓存类分享     php缓存机制
Jan 22 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
php命令行用法入门实例教程
Oct 27 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
php经典趣味算法实例代码
Jan 21 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提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
安装vue-cli的简易过程
2018/05/22 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
python中os模块详解
2016/10/14 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
20行python代码实现人脸识别
2019/05/05 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
python读取指定字节长度的文本方法
2019/08/27 Python
python创建子类的方法分析
2019/11/28 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
pandas数据拼接的实现示例
2020/04/16 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
法学毕业生自我鉴定
2013/11/08 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript