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 相关文章推荐
投票管理程序
Oct 09 PHP
PHP遍历二维数组的代码
Apr 22 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 PHP
PHP技术开发微信公众平台
Jul 22 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
Sep 11 PHP
thinkphp 验证码 的使用小结
May 07 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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编程函数安全篇
2013/01/08 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
javascript new fun的执行过程
2010/08/05 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
用python制作个音乐下载器
2021/01/30 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
幼教个人求职信范文
2013/12/02 职场文书
学校文明单位申报材料
2014/05/06 职场文书
办公用房租赁协议书
2014/11/29 职场文书
个人年终总结范文
2015/03/09 职场文书
暂住证证明
2015/06/19 职场文书
新闻稿格式范文
2015/07/18 职场文书
2016教师国培研修感言
2015/12/08 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python