php怎么采集微信公众号文章的方式

优采云 发布时间: 2020-08-24 03:10

  php怎么采集微信公众号文章的方式

  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的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;

    }

}

  使用方式:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线