关注按键遗失 微信公众号链接生成短链接
优采云 发布时间: 2020-08-22 15:58关注按键遗失 微信公众号链接生成短链接
系统:CentOS Linux release 7.6.1810 (Core)
天天模拟器:点击下载
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队列当作消息队列使用,可能出现消息消费过程中错误的情况造成消息遗失的情况进而造成数据漏爬,通过使用redis的RPOPLPUSH命令,消费者程序在从主消息队列中取出消息以后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删掉。同时我们还可以提供一个守护进程,主消息队列中的消息消费完后,可以重新将备份队列中这些未正常消费的消息再放回到主消息队列中,以便其它的消费者程序继续处理。
/**
* 从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 pattern来获取文章列表,注意f参数是html,可以实现更改下一页返回的内容为html的格式,就解决了json不好注入js脚本的问题。另外,调整offset可以实现翻页的。
下图为上述公众号第一百页的历史文章列表页面:
参考文章
感谢以下文章提供的思路:
1、用好anyproxy提升公众号文章采集效率解读
2、微信公众号文章批量采集系统的建立
联系作者
由于建立开发该陌陌采集平台花费了大量的时间和精力,所以暂时不准备开源。如果你符合这种条件:不懂技术、时间宝贵不想花时间研究、想要早日看见疗效而且本项目目前的实现的功能符合您的需求的话,可付费联系我帮您搭建此项目,并附送所有的源码,且回答并解决您在开发过程中遇见的全部疑问点。