querylist采集微信公众号文章( 数点java和js的主要特点是什么?-八维教育)
优采云 发布时间: 2021-12-08 05:04querylist采集微信公众号文章(
数点java和js的主要特点是什么?-八维教育)
<p>本文章为lonter首创,只发布在csdn平台,严禁转载 <br /> 这几天接到任务,需要开发一个微信榜单的功能,因此需要采集微信公众号文章的阅读数,点赞数和评论数,榜单内的微信公众号有一百多个,每个月出一次榜单。 <br /> 接到这个任务,我开始研究如何抓取微信阅读数,点赞数和评论数,通过大量参考网上的技术文章,最终确定了我所使用的方案:使用Fiddler进行采集 <br /> 本文章为lonter首创,只发布在csdn平台,严禁转载 <br /> 第一步:设置Fiddler <br />
<br /> 如图设置,此处为设置Fiddler支持https本文章为lonter首创,只发布在csdn平台,严禁转载 <br /> 第二步:设置Fiddler脚本 <br /> Fiddler工具打开后,选择Rules ->Customize Rules打开Fiddler ScriptEditor编辑器,编辑器如下: <br />
<br /> 这里我们只需要了解OnBeforeResponse方法,本方法为在http请求返回给客户端之前执行的方法,我们主要在本方法内进行脚本的编写本文章为lonter首创,只发布在csdn平台,严禁转载 <br /> 第三步:选择性截取responsebody存储到文本中 <br /> 研究各个请求,找到返回点赞数与评论的请求,具体请求如图: <br />
<br /> 然后开始在Fiddler ScriptEditor的方法中编写具体的存储脚本:// 首先判断请求域名是否是自己感兴趣的,以及URL中是否含有自己感兴趣的特征字符串。如果是,则将该请求的URL和QueryString记录到日志文件 "c:/fiddler-token.log"中。
if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("https://mp.weixin.qq.com/mp/getappmsgext")){
var filename = "C:/fiddler-token.log";
var curDate = new Date();
var logContent = "[" + curDate.toLocaleString() + "] " + oSession.PathAndQuery + "\r\n"+oSession.GetResponseBodyAsString()+"\r\n";
var sw : System.IO.StreamWriter;
if (System.IO.File.Exists(filename)){
sw = System.IO.File.AppendText(filename);
sw.Write(logContent);
}
else{
sw = System.IO.File.CreateText(filename);
sw.Write(logContent);
}
sw.Close();
sw.Dispose();
}</p>
这段代码的作用是存储文本中阅读和点赞数相关的数据,结果如图:
本文章为lonter首创,仅在csdn平台发布,严禁转载
第四步:篡改公众号文章页面的js代码,让页面按照你的意图自动跳转
由于这个功能可能涉及灰色地带,所以请声明,不要用它来做坏事!!!
我们来看看公众号文章的主页:
很明显,每个js脚本都是以script nonce="1007993124"开头,nonce字段是用来防止xxs的。如果 js 的 nonce 与原创的 nonce 不匹配,则不会执行 js。因此,需要在脚本中稍微写一下,具体逻辑代码如图:
这个js加载完成后,保存Fiddler ScriptEditor,然后点击微信公众号文章,在Fiddler中会看到如下内容:
然后,当你回来找页面时会自动跳转
本文章为lonter首创,仅在csdn平台发布,严禁转载
第五步:获取开发任务页面
我们需要开发一个微信转账页面,这个页面会从后台获取一个微信公众号文章,然后让微信浏览器打开
具体的html如下:
window.onload=function(){
nextdoor();
}
function nextdoor(){
var taskid=GetQueryString("taskid")
var ob={task:taskid};
$.ajax({
type: "POST",
url: "rest/wxCrawler/wxTask",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(ob),
dataType: "json",
success: function (message) {
var url=message.url;
var taskid=message.task;//每个微信客户端的id,这个id应该在后端自动生成
if(url==("http://127.0.0.1:8080/Externalservice/test.html?taskid="+taskid))
{
setTimeout(function(){window.location="http://127.0.0.1:8080/Externalservice/test.html?taskid="+taskid;},10000);
}else
{
//alert(url+"&taskid="+taskid);
window.location=url+"&taskid="+taskid+"#rd";
}
},
error: function (message) {
alert("提交数据失败");
}
});
}
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
阅读刷新中转页面,页面正在跳转中...
如一直刷新本页面,则一直等待后台分配任务
至于后端接口,我想很多人都可以写,我只做一部分:
package test.springmvc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mangofactory.swagger.plugin.EnableSwagger;
import com.wordnik.swagger.annotations.ApiOperation;
import net.sf.json.JSONObject;
import test.springmvc.Artmodel.WxTask;
import test.springmvc.redis.JedisUtil;
/**
*
* @author Administrator
*
*/
@Controller
@EnableSwagger
@RequestMapping("/wxCrawler")
public class TopController {
private final static Logger logger = LoggerFactory.getLogger(TopController.class);
JedisUtil ju=new JedisUtil();
@ApiOperation(value = "微信任务调度接口", notes = "notes", httpMethod = "POST", produces = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(value = "wxTask", method = RequestMethod.POST)
@ResponseBody
// 使用了@RequestBody,不能在*敏*感*词*中,获得流中的数据,再json转换,*敏*感*词*中,也不清楚数据的类型,无法转换成java对象
// 只能手动调用方法
public String WeixinTask(@RequestBody WxTask wt) {
String task=wt.getTask();
byte[] redisKey= task.getBytes();//队列名称
byte[] bys=ju.rpop(redisKey);
if(bys==null)
{
JSONObject json=new JSONObject();
json.put("url", "http://127.0.0.1:8080/Externalservice/test.html?taskid="+task);
json.put("task", task);
return json.toString();
}else
{
String info=new String(bys);
JSONObject json=JSONObject.fromObject(info);
String url=json.getString("url");
url=url.replace("#rd", "");
json.put("url", url);
json.put("task", task);
return json.toString();
}
}
}
这部分java和js的主要特点是可以进行多任务分布式爬虫。至此,全部开发完成
你只需要写几十万公众号文章链接,然后用微信打开:8080/Externalservice/test.html?taskid=xxxxxl 这样的转账页面,你会发现微信浏览器一直跳跃时
本文章为lonter首创,仅在csdn平台发布,严禁转载
第六步:解析存储在 Fiddler 中的文本
<p>package com.crawler.top;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import com.mysql.jdbc.UpdatableResultSet;
import com.util.DBUtil;
import net.sf.json.JSONObject;
/**
* 读取Fiddler写入的内容,并将结果写入数据库
* @author Administrator
*
*/
public class ReaderTxt {
DBUtil dbu=new DBUtil();
public static void main(String[] args)
{
ReaderTxt rt=new ReaderTxt();
ArrayList list=rt.InitTxt();
for(int i=0;i