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实现的MySQL通用查询程序
Mar 11 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
PHP实现搜索相似图片
Sep 22 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP简单实现正则匹配省市区的方法
Apr 13 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
Apr 26 PHP
PHP7 list() 函数修改
Mar 09 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
window.open的功能全解析
2006/10/10 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
vue中使用codemirror的实例详解
2018/11/01 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
Python变量作用范围实例分析
2015/07/07 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
维稳工作情况汇报
2014/10/27 职场文书
中班上学期个人总结
2015/02/12 职场文书
主婚人致辞精选
2015/07/28 职场文书
班委竞选稿范文
2015/11/21 职场文书