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
第二节--PHP5 的对象模型
Nov 16 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
Linux编译升级php的详细方法
Nov 04 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
php for 循环使用的简单实例
Jun 02 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
Aug 06 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
汉字转化为拼音(php版)
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
Python中unittest用法实例
2014/09/25 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python实现AES加密与解密
2019/03/28 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python读取并写入mat文件的方法
2019/07/12 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
《黄山奇石》教学反思
2014/04/19 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
三方合作意向书范本
2015/05/09 职场文书
地道战观后感400字
2015/06/04 职场文书
八年级历史教学反思
2016/02/19 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python