querylist采集微信公众号文章( 数点java和js的主要特点是什么?-八维教育)

优采云 发布时间: 2021-12-08 05:04

  querylist采集微信公众号文章(

数点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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线