curl之采集QQ空间留言
主要流程解析
- 首先,打开浏览器登录QQ空间并访问留言列表

- 由于QQ空间的链接是https,curl方式请求https链接需要突破https认证,这就需要下载cacert.pem,下面请看cacert.pem的部署步骤
1、将下载的`cacert.pem`文件放至php安装目录下,比如:"D:\wamp\bin\php\php5.5.12";
2、在php.ini文件末尾追加以下配置
curl.cainfo="D:/wamp/bin/php/php5.5.12/cacert.pem"
openssl.cafile="D:/wamp/bin/php/php5.5.12/cacert.pem"
3、重启wamp服务器
4、上面步骤操作完毕,即可用curl方式访问QQ空间数据了
注意事项
- 1、一定要设置时区为中国时区(避免cookie不同时区而自动过期)
- 2、在PHP 的命令行模式下执行(避免超时问题)

扩展
通过QQ空间留言的采集,可以扩展下,比如采集空间日志、说说、图片,再比如,可以尝试刷留言(最好定时执行刷留言)。
完整代码示例
<?php
date_default_timezone_set('PRC');
//内存无限制
ini_set('limit_memory', -1);
//代码执行不超时
set_time_limit(0);
//爬取QQ空间留言url
$baseUrl = "https://user.qzone.qq.com/proxy/domain/m.qzone.qq.com/cgi-bin/new/get_msgb?";
////查找留言下一页规律
//第一页
//uin=928692509&hostUin=928692509&start=0&s=0.4852990803750179&format=jsonp&num=10&inCharset=utf-8&outCharset=utf-8&g_tk=1467544760&qzonetoken=e1fa4e2c8b873a4bf33b86e6f4838942ed7a538c10b5b8cb52e2bf4a959d253f90691c5ed8b045ada7&g_tk=1467544760
//第二页
//uin=928692509&hostUin=928692509&start=10&s=0.4852990803750179&format=jsonp&num=10&inCharset=utf-8&outCharset=utf-8&g_tk=1467544760&qzonetoken=e1fa4e2c8b873a4bf33b86e6f4838942ed7a538c10b5b8cb52e2bf4a959d253f90691c5ed8b045ada7&g_tk=1467544760
//爬取QQ空间留言(自己或QQ好友)
$hostUinArr = [
'1270612806'=>'飞得更高', '928692509'=>'Burning', '2075425089'=>'怒放的生命'
];
//遍历采集QQ好友空间留言
foreach($hostUinArr as $hostUin=>$qqName) {
downloadHostUinMessage($baseUrl, $hostUin, $qqName);
}
//以好友名称为目录,将下载下来的留言单独存放
function downloadHostUinMessage($baseUrl, $hostUin, $qqName){
$qqName = iconv('UTF-8', 'GBK', $qqName);
$dir = './qqMessage/'.$qqName;
if(!is_dir($dir)) {
mkdir($dir, 0777, true);
}
$totalPages = 1;
for($i=0; $i<$totalPages; $i++){
$start = $i*10;
$params = "uin=928692509&hostUin={$hostUin}&start={$start}&s=0.4852990803750179&format=jsonp&num=10&inCharset=utf-8&outCharset=utf-8&g_tk=1467544760&qzonetoken=e1fa4e2c8b873a4bf33b86e6f4838942ed7a538c10b5b8cb52e2bf4a959d253f90691c5ed8b045ada7&g_tk=1467544760";
$url = $baseUrl . $params;
$iContent = qqCommentCurl($url);
$iContent = str_replace('_Callback(', '', $iContent);
$iContent = trim(substr($iContent, 0, -2));
//计算总页数,保证留言采集完
if($totalPages == 1) {
$iContentObj = json_decode($iContent);
if(isset($iContentObj->code) && $iContentObj->code == 0) {
$dataObj = $iContentObj->data;
$totalPages = ceil($dataObj->total/10);
} else {
//结束
return false;
}
}
file_put_contents($dir.'/'.$hostUin.'_'.$i.'.txt', $iContent);
}
}
/**
* @author RenZhicai
* QQ空间留言请求curl
* @param type $url
* @return type
*/
function qqCommentCurl($url='')
{
$ch = curl_init();
//需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。
curl_setopt($ch, CURLOPT_URL, $url);
//TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(preg_match('/http:\/\//', $url)) {
//FALSE 禁止 cURL 验证对等证书(peer's certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //这个是重点。
}
//启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_HEADER, 0);
//TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。(注意:这是递归的,"Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。)。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 这样能够让cURL支持页面链接跳转
//header头信息
$headerArr = [
"accept-language: zh-CN,zh;q=0.8",
"user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
];
//设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100')
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
//设置新的cookie,忽略之前会话时存的cookie
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
//包含 cookie 数据的文件名
curl_setopt($ch, CURLOPT_COOKIEFILE, 'daoyancookiefile');
//连接结束后,比如,调用 curl_close 后,保存 cookie 信息的文件。
curl_setopt($ch, CURLOPT_COOKIEJAR, 'daoyancookiefile');
//登录后的cookie信息
$cookieStr = "cookie: pgv_pvi=9803880448; tvfe_boss_uuid=7aa8e6046d68c6a2; RK=qBcndcbOTD; eas_sid=K1s5q0V8H8N5B4c1j9e2L0D8W3; pgv_pvid=8596381360; o_cookie=928692509; __Q_w_s_hat_seed=1; __Q_w_s__QZN_TodoMsgCnt=1; ptcz=dab5485d33e04f8612e84673ce0609bdcae13f792156f92dccf5a9784988a16a; uin=o0928692509; skey=@CgmH4oeQ8; pt2gguin=o0928692509; p_uin=o0928692509; pt4_token=Lub2nMWbTLfbx0TYxH*uyDBOU4tEBXvKvv0JNQRQuGo_; p_skey=MxE5cMJA2xHQ8BXgpbVqSL3hgeoEfcq-quN1kvcUrcQ_; pgv_info=ssid=s7150557986; Loading=Yes; qz_screen=1366x768; qqmusic_uin=; qqmusic_key=; qqmusic_fromtag=; qzmusicplayer=qzone_player_928692509_1509368391144; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=6";
//设定 HTTP 请求中"Cookie: "部分的内容。多个 cookie 用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。
curl_setopt($ch, CURLOPT_COOKIE, $cookieStr);
$output = curl_exec($ch);
if($output === false){
//记录curl请求失败的详情
$errorInfo = "cURL Error: ".curl_error($ch);
file_put_contents('curl_error_'.date('YmdHis').'.txt', $errorInfo);
}
curl_close($ch);
return $output;
}
采集效果一览


curl之采集QQ空间留言的更多相关文章
- QQ空间留言的JS
直接上代码吧... var i=0; var time; function test(str) { i++; document.getElementById('tgb').contentWindow. ...
- python基于selenium实现自动删除qq空间留言板
py大法好,让你解放双手. 脚本环境 python环境,selenium库,Chrome webdriver驱动等. 源码 # coding=utf-8 import datetime import ...
- 乐易贵宾VIP教程:百度贴吧 - QQ部落 - QQ空间 Post实战系列视频课程
教程挺不错,3套案例的实战,有需要的可以看一下百度贴吧课程目录:1.百度登录抓包分析2.百度登录[代码实现]3.百度验证码登录[代码实现]4.贴吧关注[抓包分析]5.贴吧关注(代码编写)6.贴吧签到[ ...
- Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析
QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone [没有加入多线程,希望你可以参与进 ...
- 技术揭秘“QQ空间”自动转发不良信息
大家经常会看到QQ空间自动转发一些附带链接的不良信息,即便我们的QQ密码并没有被盗取.最近通过对一个QQ空间自动转发链接进行分析,发现该自动转发机制通过利用腾讯网站存在漏洞的页面,精心构造出利用代码获 ...
- 关于恶意说说自动在QQ空间转发的机制
有些很讨厌的带链接说说,只要你在手机打开它,就会自动转发,内容极其不雅 一怒之下我决定看个究竟首先,在此页开头有此关键语句: <iframe src="http://rtb.map.q ...
- QQ空间爬虫最新分享,一天 400 万条数据(附代码地址)
http://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653552228&idx=1&sn=e476bf23556406c ...
- 用python爬取QQ空间
好久没写博文了,最近捣鼓了一下python,好像有点上瘾了,感觉python比js厉害好多,但是接触不久,只看了<[大家网]Python基础教程(第2版)[www.TopSage.com]> ...
- QQ空间漫步者
主要功能(QQ空间) 判断空间权限并跳过无法访问 留下足迹并可选:同时留言(可单独),赞主页(可单独),赞说说(可单独) 其他附加功能,导出QQ,导入群成员,好友,空间访客,说说评论,发表说说 送空间 ...
随机推荐
- Dubbo学习笔记3:Dubbo管理控制台与监控中心的搭建
Dubbo源码下载与编译 本文来讲下如何在Dubbo源码编译后,得到用于搭建管理控制台的war包和监控平台的jar包. 首先需要到Github上下载Dubbo的源码,解压后如下: 在dubbo-2.5 ...
- Docker查看映射卷报错
问题描述: 当查看Docker容器的映射卷时出现报错信息,如下: [root@kazihuo ~]# docker inspect -f {{.Volumes}} volume #volume指容 ...
- 设置view controller到iPhone或者iPad模式
在写iOS程序时,view controller的显示大小以及控件大小的调节是在是一个费力的事,尤其是对于用mac本的童鞋,更难驾驭,这时我们可以根据需要设置专门针对iphone或者ipad的view ...
- [整理]标准C中的"布尔"类型
C语言提供的基本数据类型:char , int ,float, double. 为什么没有其他语言中常见bool布尔数据类型呢? 1.在标准C语言(ANSI C)中并没有bool数据类型 标准C中,表 ...
- JS中的作用域和闭包
作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是 ...
- JS日历,可获得指定日期周数及星期几
需求来自一个朋友:编写一个简易日历.在文本框中输入要查找的日期,程序可以计算出这一天处在该年份的第几周,并且能判断出这一天到底是星期几. 应为要有交互,选择了Js来实现,也算是 结对编程 的初试吧. ...
- Android 实现两个list分别出现(在某一时刻只出现一个控件)
第一种方法: 在.xml文件中将这两个List分别放入不同的布局管理器中,比如说 <RelativeLayout android:layout_width="match_parent& ...
- 20155213 2016-2017-2 《Java程序设计》第五周学习总结
20155213 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信 ...
- 20155322 2016-2017-2 《Java程序设计》第5周学习总结
20155322 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周的学习任务是课本第八第九章: 第八章主要是讲异常处理.这里要理解Java的错误以对象的方 ...
- UNIX网络编程 第8章 基本UDP套接字编程
UDP是无连接的,不需要accept,TCP通过accept API来接受连接,并且将连接客户端的信息写入到accept将返回的新socket中,该新socket中有服务端和客户端的IP地址和端口,因 ...