自动采集文章(微信公众号查看历史消息页或者文章详情页(组图))
优采云 发布时间: 2022-02-27 00:27自动采集文章(微信公众号查看历史消息页或者文章详情页(组图))
%2BfItg%3D&pass_ticket=DGD5JOEorn3ncmbmdXKbsmgxGOEwYobX7unmU6gwxw8SzwowCh6KBA%2BRMYejszL%2F&wx_header=1
3、通过修改anyproxy配置文件解决了anyproxy拦截过程中的各种错误。
Anyproxy的内部错误会执行anyproxy配置文件rule_default.js中的onError方法,所以当报错的时候,可以修改这个方法,让它获取下一页,注入到js脚本中继续执行,不停止
*onError(requestDetail, error) {
if(/s\?__biz=/i.test(requestDetail.url) || /mp\/profile_ext\?action=home/i.test(requestDetail.url) || /mp\/getverifyinfo\?__biz=/i.test(requestDetail.url)){
var errorStr = error.toString();
console.log("++++++++++onError+++++++++++++" + errorStr + "++++++++++++++++++++++++++");
getWxPost("访问该页面出现错误",requestDetail.url,"/handleErrorLink");
console.log("++++++++++访问该页面出现错误,加载下一链接++++++++++++++++++++++++++" + requestDetail.url);
var nonce = "";
var response = "";
if(/mp\/getverifyinfo\?__biz=/i.test(requestDetail.url)){
response = getWxBizForInfo();
} else {
response = getNextUrl(nonce);
}
//response = getNextUrl(nonce);
console.log("**** onError next url or biz *****: "+ response)
return {
response: {
statusCode: 200,
header: { 'content-type': 'text/html' },
body: " 加载下一页 "+ requestDetail.url +"" + response
}
};
}
}
GitHub源码地址:wechat-serv-crawler
环境搭建与部署 安装前准备
系统:CentOS Linux 发行版7.6.1810(核心)
日常模拟器:点击下载
Node-v10.16.0:点击下载
Nodejs下载页面:点击下载
在服务器上搭建anyproxy代理相关文章:Centos7.x搭建anyproxy代理服务器
cd /opt
// 克隆项目到本地
git clone git@github.com:dengyinlei/wechat-serv-crawler.git
// 修改`wechat-serv-crawler/src/main/resources/application.properties`
`wechat-serv-crawler/src/main/resources/gd_dev/commons.cfg`
`wechat-serv-crawler/src/main/resources/gd_dev/hawkeye-tool.properties`对的数据库和redis的地址
vim wechat-serv-crawler/src/main/resources/application.properties
vim wechat-serv-crawler/src/main/resources/gd_dev/commons.cfg
vim wechat-serv-crawler/src/main/resources/gd_dev/hawkeye-tool.properties
// 修改完成后打包
cd wechat-serv-crawler && mvn clean install -Dmaven.test.skip=true
// 安装nodejs同步请求sync-request包
npm install -g sync-request
// 替换anyproxy 配置脚本 rule_default.js :
cp /opt/wechat-serv-crawler/src/main/resources/rule_default_js/rule_default.js /usr/local/nodejs/lib/node_modules/anyproxy/lib/
//关于anyproxy具体拦截请求处理的逻辑见/opt/wechat-serv-crawler/src/main/resources/rule_default_js/rule_default.js配置脚本
//生成替换所有图片,减轻浏览器负担
touch /usr/local/nodejs/lib/node_modules/anyproxy/lib/one_pixel.png
//使用pm2重启anyproxy进程:
pm2 restart all
//查看anyproxy日志:
pm2 logs anyproxy
// 数据库脚本初始化
安装完MySQL数据库后执行/opt/wechat-serv-crawler/src/main/resources/sql/table.sql脚本 初始化数据库以及相关表结构。
// 运行项目
cd /opt/wechat-serv-crawler/target && sh stop.sh && sh start.sh
首次点击动作
打开模拟器,下载anyproxy的证书并配置代理,在模拟器中登录微信添加任意好友,好友会发给你任意微信公众号历史页面或微信文章链接消息,并放消息置顶,进入消息聊天界面,点击链接自动爬取redis队列中微信公众号对应的文章,如下图:
关于自动抓取
这个程序是事件驱动的。也就是一开始必须给一个触发事件,比如打开微信公众号查看历史新闻或者打开公众号文章,然后自动跳转到下一个公众号历史消息页面或者文章@通过js注入>详情页面,当然中间可能会出现异常,异常会阻塞自动跳转到下一页,需要自动化框架的辅助来模拟手动点击动作。这里使用了atx自动化框架。
本项目自动化程度高。人工费用为首次登录微信后点击微信公众号查看历史新闻或在公众号文章中打开链接。后续跳转完全通过js注入,异常自动处理恢复点击(atx自动点击)。
运行效果展示
该项目已经是一个成熟且成熟的项目。经过大量长期测试,目前可以保证微信客户端每天采集300个公众号的数据稳定运行,不会被封号。如果您访问微信公众号的历史新闻页面过于频繁,您将被禁止 24 小时。
目前比较好的策略是访问文章页面后休眠5秒,访问微信公众号历史新闻页面后休眠150秒。
本项目功能测试成功,已稳定运行两个月。目前采集使用三个微信账号,采集每天900个微信公众号文章的数据。
每个微信账号每月费用为5元。基于该项目,可以实现*敏*感*词*运营的低成本运营。
更新(2020-07-30)在爬出错误过程中降低漏爬率)
由于我使用redis的list queue作为消息队列,在消息消费过程中可能会出现错误,导致消息丢失和数据泄露。通过使用redis的RPOPLPUSH命令,消费者程序进入slave主消息队列。消息取出后,插入到备份队列中,从备份队列中删除消息,直到消费者程序完成正常的处理逻辑。同时,我们也可以提供一个守护进程。主消息队列中的消息被消费后,备份队列中没有正常消费的消息可以放回主消息队列中,以便其他消费者程序继续处理。
/**
* 从redis队列中获取下一个待爬取的链接
* @return
*/
@RequestMapping(value = "/getNextUrl", method = RequestMethod.GET)
public String getNextUrl() {
//下一个微信公众号文章的url
String nextUrl = redisUtils.rpoplpush("wechat_content_quene", "wechat_content_backup_quene");
if (StringUtils.isNotBlank(nextUrl)) {
return nextUrl ;
}
nextUrl = redisUtils.lpop("wechat_content_backup_quene");
if (StringUtils.isNotBlank(nextUrl)) {
return nextUrl ;
}
LOGGER.info("==============队列中已无待跑的文章url,从队列中获取下一个公众号的biz==================");
//队列表如果空了,就从存储公众号biz的队列中取得一个biz
String biz = redisUtils.rpoplpush(WECHAT_BIZ_QUENE, WECHAT_BIZ_BACKUP_QUENE);
if (StringUtils.isNotBlank(biz)) {
return String.format(WECHAT_HISTORY_URL, biz);
}
biz = redisUtils.lpop(WECHAT_BIZ_BACKUP_QUENE);
if (StringUtils.isNotBlank(biz)) {
return String.format(WECHAT_HISTORY_URL, biz);
}
String errorLink = redisUtils.rpoplpush(ERROR__LINK,WECHAT_CONTENT_URL_BACKUP_QUENE);
if (StringUtils.isBlank(errorLink)) {
LOGGER.info("=================队列中已无待跑的公众号,结束本次爬取任务===================");
return EXAMPLE_CONTENT_URL;
} else {
LOGGER.info("=================从错误页面从获取爬取失败的链接===================link:{}", errorLink);
return errorLink;
}
}
获取微信公众号所有历史新闻列表,微信公众号特殊公众号也可以不关注文章获取历史:
之前实现的方案是只爬取微信公众号的最新页面文章列表。由于下一页抓包解析返回的内容是json响应体,因此无法通过注入脚本来自动模拟点击遍历。实现翻页功能。
通过分析测试发现只要使用下面的url模式获取文章的列表,注意f参数为html,可以将下一页返回的内容修改为html格式,解决了json不容易注入js脚本的问题。题。另外,调整偏移量可以实现翻页。
下图为上述公众号第100页的历史文章列表页:
参考文章
感谢以下 文章 想法:
1、使用anyproxy提高公众号效率文章采集
2、微信公众号文章批量采集系统搭建
联系作者
由于微信采集平台的搭建和开发耗费了大量的时间和精力,暂时不打算开源。如果您满足以下条件:不懂技术,时间宝贵,不想花时间研究,想尽快看到效果,并且本项目目前实现的功能满足您的需求,可以付费联系我用所有随附的源代码帮助您构建这个项目,并回答和解决您在开发过程中遇到的所有疑问。