自动采集网站内容(手机代理设置代理:安卓模拟器的代理服务器地址是什么?)

优采云 发布时间: 2021-09-28 18:00

  自动采集网站内容(手机代理设置代理:安卓模拟器的代理服务器地址是什么?)

  6、设置代理:安卓模拟器的代理服务器地址是wifi链接的网关。通过dhcp设置为静态后就可以看到网关地址了。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;

  

  现在打开微信,点击任意一个公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。

  

  现在打开浏览器地址localhost:8002就可以看到anyproxy的web界面了。从微信点击打开历史消息页面,然后在浏览器的web界面查看历史消息页面的地址会滚动。

  

  /mp/getmasssendmsg开头的网址是微信历史消息页面。左边的小锁表示这个页面是 https 加密的。现在我们点击这一行;

  ========2017 年 1 月 11 日更新 ==========

  一些以/mp/getmasssendmsg开头的微信网址会有302跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址可以看到内容。

  

  如果右侧出现html文件内容,则表示解密成功。如果没有内容,请检查anyproxy运行方式是否有参数i,是否生成CA证书,是否在手机上正确安装了证书。

  现在我们手机中的所有内容都可以明文通过代理服务器了。接下来,我们需要修改代理服务器的配置,才能获取公众号的内容。

  一、找到配置文件:

  mac系统中配置文件的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道还请见谅。根据类似mac的文件夹地址应该可以找到这个目录。

  二、修改文件rule_default.js

  找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函数

  修改函数内容(请详细阅读注释,这里只是介绍原理,了解后根据自己的情况修改内容):

  ========2017 年 1 月 11 日更新 ==========

  因为有两种页面格式,相同的页面格式总是显示在不同的微信账号中,但是为了兼容两种页面格式,下面的代码会保留两种页面格式的判断。您也可以使用自己的页面从表单中删除 li

  replaceServerResDataAsync: function(req,res,serverResData,callback){

if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)

if(serverResData.toString() !== ""){

try {//防止报错退出程序

var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则

var ret = reg.exec(serverResData.toString());//转换变量为string

HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器

var http = require('http');

http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。

res.on('data', function(chunk){

callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来

})

});

}catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。

try {

var json = JSON.parse(serverResData.toString());

if (json.general_msg_list != []) {

HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器

}

}catch(e){

console.log(e);//错误捕捉

}

callback(serverResData);//直接返回第二页json内容

}

}

}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)

try {

var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)

var ret = reg.exec(serverResData.toString());//转换变量为string

HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器

var http = require('http');

http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。

res.on('data', function(chunk){

callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来

})

});

}catch(e){

callback(serverResData);

}

}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json

try {

var json = JSON.parse(serverResData.toString());

if (json.general_msg_list != []) {

HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器

}

}catch(e){

console.log(e);

}

callback(serverResData);

}else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时

try {

HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器

}catch(e){

}

callback(serverResData);

}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)

try {

var http = require('http');

http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。

res.on('data', function(chunk){

callback(chunk+serverResData);

})

});

}catch(e){

callback(serverResData);

}

}else{

callback(serverResData);

}

},

  以上代码是使用anyproxy修改返回页面内容、向页面注入脚本、将页面内容发送到服务器的功能。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:

  在 rule_default.js 文件末尾添加以下代码:

  function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名

var http = require('http');

var data = {

str: encodeURIComponent(str),

url: encodeURIComponent(url)

};

content = require('querystring').stringify(data);

var options = {

method: "POST",

host: "www.xxx.com",//注意没有http://,这是服务器的域名。

port: 80,

path: path,//接收程序的路径和文件名

headers: {

'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',

"Content-Length": content.length

}

};

var req = http.request(options, function (res) {

res.setEncoding('utf8');

res.on('data', function (chunk) {

console.log('BODY: ' + chunk);

});

});

req.on('error', function (e) {

console.log('problem with request: ' + e.message);

});

req.write(content);

req.end();

}

  以上是规则修改的主要部分。您需要将json内容发送到您自己的服务器,并从服务器获取到下一页的跳转地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php

  在详细介绍这4个php文件之前,为了提高采集系统性能,降低崩溃率,我们还可以做一些修改:

  Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:

  replaceRequestOption : function(req,option){

var newOption = option;

if(/google/i.test(newOption.headers.host)){

newOption.hostname = "www.baidu.com";

newOption.port = "80";

}

return newOption;

},

  以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果报错,程序可能无法干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。再次,请原谅我不熟悉windows命令。

  接下来详细介绍一下服务器端接收程序的设计原理:

  (以下代码不能直接使用,只介绍原理,部分需要根据自己的服务器数据库框架编写)

  1、getMsgJson.php:该程序负责接收历史消息的json,解析并存入数据库

<p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线