一、基本介绍
公众号是当前社交媒体中应用最广泛的一种,每天都有大量的文章在上面发布。这些文章对于很多人来说是非常有价值的。而对于一些应用程序开发者,他们需要将这些文章采集下来,以便在自己的应用中使用。
公众号文章采集的实现可以分为两个步骤:获取文章列表和获取文章详情。其中获取文章详情是采集过程的核心。
二、获取文章列表
获取文章列表需要模拟用户在微信客户端进行操作,包括登录微信账户、进入公众号页面、拉取列表数据等。由于微信客户端的加密算法非常复杂,因此我们可以使用一些第三方的SDK或者API工具来实现。
下面是一个获取公众号文章列表的接口示例:
<?php
//请求参数
$params = array(
'token' => 'your_token',
'account' => '公众号名称',
'offset' => 0,
'count' => 10
);
//请求地址
$url = 'https://api.weixin.qq.com/cgi-bin/appmsg?action=list';
//发送请求
$response = file_get_contents($url . http_build_query($params));
//处理响应数据
$data = json_decode($response, true);
?>
三、获取文章详情
获取文章详情需要模拟用户进入文章页面之后的操作,包括加载页面、获取页面中的数据等。
由于微信客户端有反爬虫机制,因此我们需要在采集过程中注意一些细节,例如设置随机的User-Agent头信息、合理设置请求频率等。
下面是一个获取公众号文章详情的接口示例:
<?php
//请求参数
$params = array(
'token' => 'your_token',
'account' => '公众号名称',
'appmsgid' => '文章ID',
'frommsgid' => '最近一篇文章的ID',
'is_only_read' => 1
);
//请求地址
$url = 'https://mp.weixin.qq.com/s?';
//发送请求
$response = file_get_contents($url . http_build_query($params), false, stream_context_create(array(
'http' => array(
'header' => 'User-Agent: ' . rand_user_agent() . '\r\n'
)
)));
//处理响应数据
$data = parse_article_detail($response);
?>
四、User-Agent头信息随机生成
User-Agent头信息包含了请求的客户端软件的名称、版本、操作系统名称、版本等等信息。在实际采集过程中,我们可以使用一些第三方工具来生成随机的User-Agent信息,避免被识别为爬虫程序。
下面是一个User-Agent头信息随机生成的示例:
<?php
$user_agents = array(
'Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0',
'Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0',
'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1'
);
function rand_user_agent() {
global $user_agents;
return $user_agents[array_rand($user_agents)];
}
?>
五、文章详情解析
获取到的文章详情页面中除了文章的正文外还包含大量的嵌套结构、无意义信息和广告。因此我们在解析文章详情时需要剔除这些内容,只保留文章正文相关的信息。在实际解析过程中,我们可以使用一些HTML解析器或者正则表达式进行实现。
下面是一个使用正则表达式从HTML页面中获取文章正文的示例:
<?php
function parse_article_detail($html) {
$article = array();
$pattern = "/(<div class='rich_media_content'.*?>.*?<\/div>)/s";
preg_match($pattern, $html, $matches);
$content = $matches[1];
$content = preg_replace('/\<script(.*?)\>(.*?)\<\/script\>/si', '', $content);
$content = preg_replace('/<span style="display:none">(.*?)<\/span>/si', '', $content);
$content = strip_tags($content, '<p><br><strong><a><img>');
$article['content'] = $content;
return $article;
}
?>
六、总结
公众号文章采集是很多应用程序中需要实现的功能之一,但是其过程中需要考虑到很多细节,例如反爬虫机制、请求频率、肉眼可读性等等。只有掌握了这些技巧以后,我们才能够顺利地完成采集任务。