高蒙2017/02/0613:491.0w瀏覽0評論
優(yōu)采云 發(fā)布時(shí)間: 2021-08-27 04:04高蒙2017/02/0613:491.0w瀏覽0評論
首頁(yè) ?PHP 筆記? 如何使用 php采集微信公號文章方法
如何使用php采集微信公號文章
高萌 2017/02/06 13:491.0w 瀏覽 0 條評論 PHP
最近有采集微信公號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于列表地址的獲取,我們后面再研究。在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。下面是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),是的
最近有采集微信官方號文章的需求,所以研究了一下。我發(fā)現在刷新搜狗微信公眾號文章列表的時(shí)候,有一個(gè)很惡心的地方就是搜狗會(huì )直接屏蔽你的ip并輸入驗證碼。這一步暫時(shí)不知道怎么破解。我們只是看php采集微信公號文章內容的方法。至于list地址的獲取,我們以后再研究。
在寫(xiě)之前,我搜索了三個(gè)用php編寫(xiě)的爬蟲(chóng):phpQuery、phpspider和QueryList(phpQuery的改進(jìn)版本)??赡懿恢惯@些,這就是我發(fā)現的。先記錄,后研究。
以下是我寫(xiě)的一個(gè)基本的微信公眾號php采集類(lèi),有待進(jìn)一步完善。
/**
?*?Created?by?PhpStorm.
?*?User:?Administrator
?*?Date:?2017/2/6
?*?Time:?10:54
?*?author:?gm
?*?微信公眾號文章采集類(lèi)
?*/
class?DownWxArticle?{
private???$mpwxurl?=?'http://mp.weixin.qq.com';
private???$wxgzherr=?'公眾號二維碼下載失敗=>';
private???$wximgerr=?'圖片下載失敗=>';
private???$direrr??=?'文件夾創(chuàng )建失??!';
private???$fileerr?=?'資源不存在!';
private???$dirurl??=?'';
????/*?抓取微信公眾號文章
?*?$qcode????boolean?公眾號二維碼?false=>不下載?true=>下載
?*?return
?*?$content??string??內容
?*?$tile?????string??標題
?*?$time?????int?????時(shí)間戳
?*?$wxggh????string??微信公眾號
?*?$wxh??????string??微信號
?*?$qcode????string??公眾號二維碼
?*?$tag??????string??標簽?原創(chuàng )
?*/
????function?get_file_article($url,$dir='',$qcode=false)
????{
$this->dirurl?=?$dir?:'/Uploads/'.date('Ymd',time());
????????if(!$this->put_dir($this->dirurl)){
exit(json_encode(array('msg'=>$this->direrr,'code'=>500)));
}
????????$file?=?file_get_contents($url);
????????if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
????????????exit(json_encode(array('msg'=>$this->fileerr,'code'=>500)));
????????}
????????//?內容主體
????????preg_match('/[\s\S]*?/',$file,$content);
????????//?標題
????????preg_match('/(.*?)/',$file,$title);
????????$title?=?$title?$title[1]:'';
????????//?時(shí)間
????????preg_match('/(.*?)/',$file,$time);
????????$time?=?$time?strtotime($time[1]):'';
????????//?公眾號
????????preg_match('/(.*?)/',$file,$wxgzh);
????????$wxgzh?=?$wxgzh?$wxgzh[1]:'';
????????//?微信號
????????preg_match('/([\s\S]*?)/',$file,$wxh);
????????$wxh???=?$wxh?$wxh[1]:'';
????????//?公眾號二維碼
????????if($qcode){
????????????preg_match('/window.sg_qr_code="(.*?)";/',$file,$qcode);
????????????$qcodeurl?=?str_replace('\x26amp;','&',$this->mpwxurl.$qcode[1]);
????????????$qcode?=?$this->put_file_img($this->dirurl,$qcodeurl);
????????????if(!$qcode){
????????????????$this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
????????????}
????????}
????????//?獲取標簽
????????preg_match('/(.*?)/',$file,$tag);
????????$tag?=?$tag?$tag[1]:'';
????????//?圖片
????????preg_match_all('//',$content[0],$images);
????????//?儲存原地址和下載后地址
????????$old?=?array();
????????$new?=?array();
????????//?去除重復圖片地址
????????$images?=?array_unique($images[1]);
????????if($images){
????????????foreach($images?as?$v){
????????????????$filename?=?$this->put_file_img($this->dirurl,$v);
????????????????if($filename){
????????????????????//?圖片保存成功?替換地址
????????????????????$old[]?=?$v;
????????????????????$new[]?=?$filename;
????????????????}else{
????????????????????//?失敗記錄日志
????????????????????$this->put_error_log($this->dirurl,$this->wximgerr.$v);
????????????????}
????????????}
????????????$old[]?=?'data-src';
????????????$new[]?=?'src';
????????????$content?=?str_replace($old,$new,$content[0]);
????????}
???????//?替換音頻
???????$content?=?str_replace("preview.html","player.html",$content);?
???????//?獲取閱讀點(diǎn)贊評論等信息
???????$comment?=?$this->get_comment_article($url);
$data?=?array('content'=>$content,'title'=>$title,'time'=>$time,'wxgzh'=>$wxgzh,'wxh'=>$wxh,'qcode'=>$qcode?:'','tag'=>$tag?:'','comment'=>$comment);
????????return?json_encode(array('data'=>$data,'code'=>200,'msg'=>'ok'));
????}
????/*?抓取保存圖片函數
?????*?return
?????*?$filename??string??圖片地址
?????*/
????function?put_file_img($dir='',$image='')
????{
????????//?判斷圖片的保存類(lèi)型?截取后四位地址
????????$exts?=?array('jpeg','png','jpg');
????????$filename?=?$dir.'/'.uniqid().time().rand(10000,99999);
????????$ext?=?substr($image,-5);
????????$ext?=?explode('=',$ext);
????????if(in_array($ext[1],$exts)?!==?false){
????????????$filename?.=?'.'.$ext[1];
????????}else{
????????????$filename?.=?'.gif';
????????}
????????$souce?=?file_get_contents($image);
????????if(file_put_contents($filename,$souce)){
????????????return?$filename;
????????}else{
????????????return?false;
????????}
????}
????/*?獲取微信公眾號文章的【點(diǎn)贊】【閱讀】【評論】
?????*?方法:將地址中的部分參數替換即可。
?????*?????1、s??????替換為?mp/getcomment?
?????*?????2、最后=??替換為?%3D
?????*?return
?????*?read_num??閱讀數
?????*?like_num??點(diǎn)贊數
?????*?comment???評論詳情
?????*/
????function?get_comment_article($url='')
????{
????????$url?=?substr($url,0,-1);
????????$url?=?str_replace('/s','/mp/getcomment',$url).'%3D';
????????return?file_get_contents($url);
????}
????/*?錯誤日志記錄
?????*?$dir??string??文件路徑
?????*?$data?string??寫(xiě)入內容
?????*/
????function?put_error_log($dir,$data)
????{
????????file_put_contents($dir.'/error.log',date('Y-m-d?H:i:s',time()).$data.PHP_EOL,FILE_APPEND);
????}
????/*?創(chuàng )建文件夾
?????*?$dir?string?文件夾路徑
?????*/
????function?put_dir($dir=''){
$bool?=?true;
????????if(!is_dir($dir)){
????????????if(!mkdir($dir,777,TRUE)){
$bool?=?false;
????????????????$this->put_error_log($dir,$this->direrr.$dir);
????????????}
????????}
return?$bool;
????}
}
使用方法:
$url?=?'';
$article?=?new?DownWxArticle();
$article->get_file_article($url,'',true);