php怎么采集微信公众号文章的方式
优采云 发布时间: 2020-08-24 03:10php怎么采集微信公众号文章的方式
最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。下面是我写的一个基本的微信公众号php采集类,有
最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。
在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。
下面是我写的一个基本的微信公众号php采集类,有待进一步建立。
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/2/6
* Time: 10:54
* author: gm
* 微信公众号文章采集类
*/
class DownWxArticle {
private $mpwxurl = 'http://mp.weixin.qq.com';
private $wxgzherr= '公众号二维码下载失败=>';
private $wximgerr= '图片下载失败=>';
private $direrr = '文件夹创建失败!';
private $fileerr = '资源不存在!';
private $dirurl = '';
/* 抓取微信公众号文章
* $qcode boolean 公众号二维码 false=>不下载 true=>下载
* return
* $content string 内容
* $tile string 标题
* $time int 时间戳
* $wxggh string 微信公众号
* $wxh string 微信号
* $qcode string 公众号二维码
* $tag string 标签 原创
*/
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]:'';
// 时间
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);
// 获取阅读点赞评论等信息
$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='')
{
// 判断图片的保存类型 截取后四位地址
$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;
}
}
/* 获取微信公众号文章的【点赞】【阅读】【评论】
* 方法:将地址中的部分参数替换即可。
* 1、s? 替换为 mp/getcomment?
* 2、最后= 替换为 %3D
* return
* read_num 阅读数
* like_num 点赞数
* 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 写入内容
*/
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);
}
/* 创建文件夹
* $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;
}
}
使用方式: