自动采集编写 微信公众号查看历史消息页或者文章详情页(组图)

优采云 发布时间: 2021-08-27 07:01

  自动采集编写 微信公众号查看历史消息页或者文章详情页(组图)

  %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 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的证书并配置代理,在模拟器中登录微信随意添加好友,好友发送给你任意微信公众号的历史消息页面或微信文章linked message ,并将消息置顶,进入消息聊天界面,点击链接开始自动抓取redis队列中微信公众号对应的文章,如下图:

  

  关于自动抓取

  这个程序是事件驱动的。也就是说一开始必须给一个触发事件,比如打开微信公众号查看历史消息或者打开一个公众号文章,然后自动跳转到下一个公众号历史消息页面或者文章详情页通过js注入,当然这中间可能会出现异常,异常会阻塞自动跳转到下一页。这需要自动化框架的帮助来模拟手动点击操作。这里使用的是 atx 自动化框架。

  该项目自动化程度高。人工费用为首次登录微信后,点击微信公众号查看历史消息或打开公众号文章链接。后续会完全通过js注入跳转,异常自动处理恢复点击(atx自动点击)。

  运行效果展示

  这个项目已经是一个完整成熟的项目了。经过大量长期测试,一个微信客户端采集300公众号文章每天的数据可以保证稳定运行,保证账号不会被封。如果您访问微信公众号历史新闻页面过于频繁,将会被24小时禁言。

  目前比较好的策略:访问文章页面后休眠5秒,访问微信公众号历史消息页面后休眠150秒。

  本项目功能测试成功,已稳定运行两个月。目前采集使用3个微信公众号,采集900微信公众号每天文章数据。

  每个微信账号月费5元。基于该项目,可实现*敏*感*词*作业的低成本作业。

  

  更新(2020-07-30)以降低抓取错误时漏网率

  因为我使用redis的list队列作为消息队列,消息消费过程中可能会出现错误,导致消息丢失和数据泄露。通过使用redis的RPOPLPUSH命令,消费者程序在slave master 从消息队列中取出消息后,插入到备份队列中,并从备份队列中删除消息,直到消费者程序完成正常的处理逻辑同时,我们还可以提供守护进程。消费完主消息队列中的消息后,可以将备份队列中正常未消费的消息放回主消息队列,以便其他消费程序继续处理。

   /**

* 从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响应体,无法通过注入脚本自动模拟。 Traverse实现翻页功能。

  通过分析测试发现只要使用下面的url模式获取文章列表,注意f参数为html,下一页返回的内容格式即可修改为html,解决了json不适合注入js脚本的问题。此外,还可以通过调整偏移量来实现翻页。

  下图为上述公众号文章list页面第100页的历史记录:

  

  参考文章

  感谢文章提供的想法:

  1、用好anyproxy提高公众号文章采集efficiency详解

  2、微信公号文章batch采集系统建设

  联系作者

  由于微信采集平台的搭建和开发花费了大量的时间和精力,我们暂时不打算开源。如果您满足以下条件:不懂技术,时间宝贵,不想花时间研究,想尽快看到效果,且本项目目前实现的功能满足您的需求,可以付费联系我帮你搭建这个项目,并收录所有源代码,解答和解决你在开发过程中遇到的所有疑问。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线