PHP微信公众号文章爬虫

整理了一下前段时间写的php微信公众号文章的爬虫,解决了微信的防=防盗链机制,这里对图片进行了统一管理。代码使用tp3框架写的,可以根据实情换成tp5或者laravel框架的代码。

 

爬虫的参数可自行修改,我这里是项目需要,传的验证参数

/**
     * 进入url手动采集文章逻辑
     *
     */

    public function manual($centent_url,$cateidstring,$status)

    {
        $request = trim($centent_url);

        //地址验证(不完整的验证,后补)
        if (empty($request)){

            $resdata["r"]=3;
            return $resdata;
            exit;
        }
        //抓取文章内容

        $html = $this->getUrlContent($request);
        $result = array();
        //抓取文章主要内容
        preg_match_all("/id=\"js_content\">(.*)<script/iUs",$html,$content,PREG_PATTERN_ORDER);
        //dump($html);exit;

        $content = "<div id='js_content'>".$content[1][0];

        //$content变量的值是前面获取到的文章内容html
        $content = str_replace("data-src","src",$content);
        //$content变量的值是前面获取到的文章内容html
        $content= str_replace("preview.html","player.html",$content);
        //将视频地址中的&amp全部替换成&
//        $content = str_replace("&amp","&",$content);
        //$html变量的值是前面获取到的文章全部html
        preg_match_all('/var msg_title = \"(.*?)\";/si',$html,$m);
        $msg_title = $m[1][0];//文章标题

        $res = $this->robotartmodel->where(array("title"=>$msg_title))->find();

        if ($res){
            $resdata["r"]=2;
            return $resdata;
            exit;
        }

        preg_match_all('/var msg_desc = \"(.*?)\";/si',$html,$m);
        $msg_desc = $m[1][0];//文章标题
        /*preg_match_all('/var round_head_img = \"(.*?)\";/si',$html,$m);
        $head_img = $m[1][0];//公众号头像*/
        preg_match_all('/var publish_time = \"(.*?)\";/si',$html,$m);
        $temp = $m[1][0];//零时日期存储
        preg_match('/([0-9]{4})-([0-9]{2})-([0-9]{2})/', $temp,$n);
        $publish_time = $n[0];//获取发布时间
        preg_match_all('/var msg_cdn_url = \"(.*?)\";/si',$html,$m);
        $msg_cdn_url = $m[1][0];//首张图片
        preg_match('/var nickname = \"(.*?)\";/si',$html,$m);
        $category = $m[1];//公众号
//        preg_match_all('/^https://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/',$html,$m);

//        $video_url = $m[1][0];//视频地址

        //视频地址

        //https://v.qq.com/x/page/*****.html 获取到的vid参数,将星号替换

        preg_match_all('/src=\"(.*?)\"/si',$content,$m);//获取src集合

        $imgUrl = $m[1];

        $imagearr = $this->crabImage($msg_cdn_url);

        //处理图片

        //将图片下载到本地文件夹中

        $savepath = array();

        foreach ($imgUrl as $key => $value){

            //这里的crabImage图片下载本地函数可以再前面的几篇文章中找一下

            $res = $this->crabImage($value);

            //保存后的地址存入$savepath中

            $savepath[$key] = $res['save_path'];

        }

        //将$content中的图片地址全部替换成$save_path

        foreach ($savepath as $k => $val){

            $content = str_replace($imgUrl[$k],$val,$content);

        }

        $map['nickname']=$category;

        //根据微信号名称判断事都已经保存在数据库中

        $pubwechatinfo=$this->robotpubwechatmodel->where($map)->find();

        if($pubwechatinfo){

            $pubwcid = $pubwechatinfo['id'];

        }else{

            $map['status']=1;

            $pubwcid=$this->robotpubwechatmodel->add($map);

        }

        $result['pubwcid']=$pubwcid;

        //将替换过的内容部分再替换出原$html里的内容

        $result['content']      = $content;

        $result['title']        = $msg_title;

        $result['description']  = $msg_desc;

        $result['publish_time'] = $publish_time;

        $result['create_time']  = date('Y-m-d H:i:s');

        $result['image']        = $imagearr['save_path'];

        $result['search_url']   = $request;

        $result['status']       = $status;
        $result["cateid"]      = $cateidstring;
        //文章的保存和处理

        $data =$this->robotartmodel->add($result);

        //将存储的文章信息写入分类表

        /* $val = $article_category->insert(['category'=>$result['category']]);*/
        //dump($pubwcid.'<br>'.$data);exit;

       if($pubwcid && $data){

           $resdata["r"]=1;
           $resdata["artid"]=$data;
       }else{
           $resdata["r"]=0;
       }
       return $resdata;
    }
    
    /**
     * 爬虫程序
     * 从给定的url获取html内容
     * @param string $url
     * @return string

     */

    function getUrlContent($request) {

        $handle = fopen($request, "r");

        if ($handle) {

            $content = stream_get_contents($handle, -1);

            //读取资源流到一个字符串,第二个参数需要读取的最大的字节数。默认是-1(读取全部的缓冲数据)

            // $content = file_get_contents($url, 1024 * 1024);
            
            //这里也可以用php的curl爬取网页内容,可将curl爬取方式封装在这里

            return $content;
        } else {
            return false;
        }
    }

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
爬虫是一种自动抓取网页数据的程序,可以用于获取微信公众号的内容信息。下面是一个简单的Python爬虫示例,使用了`requests`库来发送HTTP请求并解析HTML内容,以及使用了`BeautifulSoup`库来进行HTML内容的解析: ```python import requests from bs4 import BeautifulSoup def get_wechat_article(url): # 发送GET请求到指定URL获取文章页面 response = requests.get(url) # 检查请求是否成功 if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') # 解析文章标题、作者、发布日期等信息 title = soup.find('title').text.strip() author = soup.find(id="js_content").find_previous("h2", class_="rich_media_title").text.strip() date = soup.find(id="js_content").find_next_sibling("span").text.strip() # 解析文章内容 article_text = "" for paragraph in soup.find_all("p"): article_text += paragraph.text.strip() + "\n\n" return {'title': title, 'author': author, 'date': date, 'content': article_text} else: print(f"Request failed with status code {response.status_code}") return None # 使用示例 url = "https://mp.weixin.qq.com/s/YsJZxXjwO7oBzRyvLk986A" # 微信公众号文章链接 article_info = get_wechat_article(url) if article_info is not None: print(f"Title: {article_info['title']}\nAuthor: {article_info['author']}\nDate: {article_info['date']}") print("\nContent:\n") print(article_info['content']) else: print("Failed to fetch the article.") ``` 请注意,这个示例仅作为一个基础框架,并可能存在一定的局限性和失效情况,尤其是当网站结构发生变化时。实际应用中,需要考虑到更多的边界条件和异常处理。 ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值