抓取微信公众号文章及本地化

最近单位需要我做个做个可以抓取微信公众号文章的功能,说实话本人一个菜鸟,居然要完成这样的工作,真的太难了。本来想说做个爬虫就好了,但是微信公众号文章的抓取通常是到搜狗微信搜索上去抓取,结果他的反爬虫机制让我这个菜鸟无从下手。后来在“伟大”的百度帮助下,我找到了现成的抓取爬虫。不过是python写的。解决了抓取问题,接下来就是本地化的问题。我用了PHP的file_get_contents()函数,将临时链接的文章信息全部保存为字符串信息保存在数据库中,这样就不担心链接过时问题了。
接下来上代码,抓取的爬虫链接在此

http://blog.youkuaiyun.com/niuxiaojia09/article/details/55260770


Controller层

 //根据文章临时地址将文章本地化存入数据库
    public function actionGetimg()
    {
        $query = \Yii::$app->db;
        $reulrt = $query->createCommand("SELECT * FROM `wenzhang_info` ;")->queryAll();

       foreach($reulrt as $key){
          $date_time=strtotime($key['date_time']);
            $model = new wenzhang_bendi_static_();
            $model->resetPartitionIndex($key['_id']);
            $model->id= $key['_id'];
            $model->title = html_entity_decode($key['title']);
            $model->mpid = $key['mp_id'];
            $model->cover_url = $key['cover_url'];
            $model->date_time = $key['date_time'];
            $model->date_unix = $date_time;
            $model->msg_index = $key['msg_index'];

           //根据临时链接获得网页的源代码
            $html = file_get_contents($key['content_url']);
            //去除<!--headTrap<body></body><head></head><html></html>-->
           $html = str_replace("<!--headTrap<body></body><head></head><html></html>-->", "", $html);
           //去除多余重复的空格和<p>标签
            $html = preg_replace(array('/\s*(<br\s*\/?\s*>\s*){2,}/im','/(<p>(\s|\s*<br\s*\/?\s*>\s*)*<\/p>)+/im','/(<p>(\s|\s*<span\s*\/?\s*>\s*)*<\/p>)+/im'),array('\\1\\1',''), $html);
          //微信图片的跳板
           $href='http://pic.visionbang.com/?url=';
           //讲图片的data-src里的链接换成src的链接
            $info=preg_replace('/<img.+?data-src=\"(.+?)\"/i','<img src="'.$href.'\1"  ',$html);
            //去除JS代码,以免视频无法显示
            $str=preg_replace('/<(script.*?)>(.*?)<(\/script.*?)>/si', " " ,$info);
            //转换视频链接方便显示
            $str=preg_replace('/<iframe.*?data-src=".+?vid=(.+?)&(.+?)&(.+?)&(.+?)".*?>/','<iframe src="https://v.qq.com/iframe/player.html?vid=\1&\4" style="width:100%;height:auto;display:block;overflow:hidden;"scrolling="no"frameborder="0">" ' ,$str);
          $time=date('Ymd',$date_time);
            $times=date('d',$date_time);
            //创建文件夹
            if(!is_dir("html/$time")){
                mkdir("html/$time");
            }
            //创建文件夹
            if(!is_dir("html/$time/$times")){
                mkdir("html/$time/$times");
            }
            //路径保存
            $path='html/'.$time.'/'.$times.'/'.$key['_id'].'.html';
            //创建静态文件
            $f=fopen($path,'w');
            fwrite($f,$str);
            $y=fclose($f);
            //保存路径
            $model->article_info=$path;
            $model->insert();
       }

        //删除抓取来的文章内容
       $query->createCommand(" delete from wenzhang_info ")->execute();

        return $this->render('image');
    }
}

主要的困难就是几个正则而已,因为前面的抓取功能有别人的代码所以我打个酱油就完成了这个功能。不过说来还是要去学下python,免得后期搜狗又改了规则我却不知道怎么办。

### 使用爬虫抓取微信公众号全网关键词的方法和工具 为了有效抓取微信公众号中的全网关键词,可以采用多种方法和技术来实现这一目标。下面介绍一种较为全面的技术方案。 #### 方法概述 通过构建一个专门针对微信公众号文章搜索引擎,能够更精准地定位并提取含有特定关键词的文章。该引擎不仅支持基于关键词的全文检索,还提供高级筛选条件,如发布时间范围、作者等参数设置[^1]。 #### 技术栈选择 - **编程语言**: Python 是首选的语言之一,因为它拥有丰富的第三方库支持网络请求处理以及HTML解析等功能。 - **框架/库**: - `requests` 或者 `httpx`: 发起HTTP(S) 请求访问API接口或网页资源。 - `BeautifulSoup4`, `lxml`: 解析返回的内容,特别是对于结构化较差但遵循一定模式的页面非常有用。 - `pandas`: 如果需要进一步清洗数据或将结果导出为Excel文件,则此库不可或缺。 #### 实现步骤详解 ##### 步骤一:准备环境与依赖安装 确保本地已安装Python解释器,并通过pip命令安装必要的扩展包: ```bash pip install requests beautifulsoup4 lxml pandas httpx ``` ##### 步骤二:发起搜索请求 利用官方提供的开放平台或其他合法途径获得授权后调用微信相关API接口进行查询操作。如果无法直接获取API权限,则可以通过模拟浏览器行为向搜狗微信搜索或者其他聚合类网站发送GET请求完成初步的信息收集工作。 ```python import httpx def fetch_search_results(keyword, page=1): url = f"https://weixin.sogou.com/weixin?type=2&query={keyword}&page={page}" response = httpx.get(url) if response.status_code != 200: raise Exception(f"Failed to retrieve data from {url}") return response.text ``` ##### 步骤三:解析响应内容 收到服务器回应之后,使用BS4或者LXML这样的DOM树解析工具从中抽取所需字段,比如标题、摘要描述、发布日期等等重要信息点。 ```python from bs4 import BeautifulSoup def parse_html(html_content): soup = BeautifulSoup(html_content, 'html.parser') items = [] for item in soup.select('.news-list li'): title = item.find('h3').get_text(strip=True) summary = item.find(class_='txt-info').get_text(strip=True) pub_date = item.find(class_='s-p').attrs['t'] items.append({ "title": title, "summary": summary, "pub_date": datetime.fromtimestamp(int(pub_date)).strftime('%Y-%m-%d'), }) return items ``` ##### 步骤四:去重过滤机制 为了避免重复记录同一篇文章,在存储之前应该先做一次简单的哈希校验或是依据URL地址作为唯一标识符来进行判断是否存在相同条目。 ##### 步骤五:保存至数据库或文件系统 最后一步就是把经过加工后的干净数据持久化下来供后续分析使用。可以选择关系型数据库(MySQL), NoSQL(MongoDB),甚至是CSV/XLSX表格形式都行得通。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值