文章采集调用(lonter首创,只发布在csdn平台,严禁转载这几天任务)

优采云 发布时间: 2021-08-30 00:03

  文章采集调用(lonter首创,只发布在csdn平台,严禁转载这几天任务)

  此文章为lonter首创,仅发布于csdn平台,严禁转载

  这几天接到任务,需要开发微信列表功能,所以需要采集微信公号文章阅读、点赞、评论数。列表中有一个微信公众号。有一百多个,每月公布一次名单。

  接到这个任务后,我开始研究如何抓取微信阅读、点赞和评论的数量。通过大量参考网上文章的技术,最终确定了我使用的解决方案:使用Fiddler for采集

  此文章为lonter首创,仅发布于csdn平台,严禁转载

  第 1 步:设置 Fiddler

  

  如图设置,这里是设置Fiddler支持https

  此文章为lonter首创,仅发布于csdn平台,严禁转载

  第 2 步:设置 Fiddler 脚本

  打开Fiddler工具后,选择Rules ->Customize Rules打开Fiddler ScriptEditor编辑器,编辑器如下:

  

  这里我们只需要了解 OnBeforeResponse 方法即可。该方法在 http 请求返回给客户端之前执行。我们主要在这个方法中编写脚本。

  此文章为lonter首创,仅发布于csdn平台,严禁转载

  第3步:选择性拦截responsebody并存入文本

  研究每个请求,找到返回点赞数和评论数的请求。具体请求如图:

  

  然后开始在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();

}

  这段代码的作用是存储文本中阅读和点赞数相关的数据,结果如图:

  

  此文章为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人工客服


线