最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时候,有个很恶心的地方就是搜狗会直接的把你的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('/<div class="rich_media_content " id="js_content">[\s\S]*?<\/div>/',$file,$content);
        // 标题
        preg_match('/<title>(.*?)<\/title>/',$file,$title);
        $title = $title?$title[1]:'';
        // 时间
        preg_match('/<em id="post-date" class="rich_media_meta rich_media_meta_text">(.*?)<\/em>/',$file,$time);
        $time = $time?strtotime($time[1]):'';
        // 公众号
        preg_match('/<a class="rich_media_meta rich_media_meta_link rich_media_meta_nickname" href="##" id="post-user">(.*?)<\/a>/',$file,$wxgzh);
        $wxgzh = $wxgzh?$wxgzh[1]:'';
        // 微信号
        preg_match('/<span class="profile_meta_value">([\s\S]*?)<\/span>/',$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('/<span id="copyright_logo" class="rich_media_meta meta_original_tag">(.*?)<\/span>/',$file,$tag);
        $tag = $tag?$tag[1]:'';
        // 图片
        preg_match_all('/<img.*?data-src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.jpeg|\.?]))[\'|\"].*?[\/]?>/',$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;
    }
}

使用方法:

$url = '';
$article = new DownWxArticle();
$article->get_file_article($url,'',true);

以上就是用php采集微信公众号文章内容的方法。

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!