zoukankan      html  css  js  c++  java
  • curl之采集QQ空间留言

    主要流程解析

    • 首先,打开浏览器登录QQ空间并访问留言列表
    • 由于QQ空间的链接是https,curl方式请求https链接需要突破https认证,这就需要下载cacert.pem,下面请看cacert.pem的部署步骤
    1、将下载的`cacert.pem`文件放至php安装目录下,比如:"D:wampinphpphp5.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;
    }
    
    

    采集效果一览

  • 相关阅读:
    完整的UED流程
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    部署方案模板
    商城项目合作
    架构师分类
    k8s视图
    虚拟化通信技术
    AxureRP8 实现时间功能
    在AxureRP8中实现广告文字滚动效果
    获取当前网络中的电脑数目及MAC-通过MAC查找IP-通过IP查询机器名
  • 原文地址:https://www.cnblogs.com/renzhicai/p/7758355.html
Copyright © 2011-2022 走看看