文章目錄
  1. 1. 模拟登录使用到的模块
  2. 2. 分析
    1. 2.1. 登录获取Cookie
    2. 2.2. 用获取的cookie发帖
  3. 3. 全部代码

爬虫是个有趣的东西,经常上V2EX,就像模拟登录然后自动领取每天的奖励,结果不行测试的过程中导致IP被封,还是等等吧,就找了个别的网站模拟下。

模拟登录使用到的模块

  1. eventproxy流程控制
  2. superagent是一个轻量的Ajax API,服务器端(Node.js)客户端(浏览器端)均可使用,SuperAgent具有学习曲线低、使用简单、可读性好的特点,可作为客户端请求代理模块使用,当你想处理get,post,put,delete,head请求时,可以考虑使用SuperAgent。
  3. cheerio网页解析工具

分析

登录获取Cookie

先用浏览器获取登录时的Header

定义一个尽可能详细的header,为了保护原网站,我打马赛克了。

1
2
3
4
5
6
7
var  httpHeader = {
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'xxx.xx',
Origin: 'http://xxx.xxx',
Referer: 'http://xxx.xxx/login/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0'
};

定义账户的POST数据

1
2
3
4
5
6
var accountData = {
email: 'ccccc@gmail.com',
password: 'ccccc',
remember: 'on',
from: '/'
};


通过这个图可以发现登录后,浏览器会提交如图中的cookie,所以我需要模拟提交一个类似的cookie。
然后用superagent模拟登录,如果返回的result中包含set-cookie说明登录成功,然后组合成一个途中的cookie。只需要把Set-Cookie数组中的uid和password提取出来就可以。如果返回的result不存在或者set-cookie不存在则说明登录失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
superagent
.post(baseUrl)
.set(httpHeader)
.type('form')
.send(accountData)
.redirects(0)
.end(function(err, result) {
if (typeof(result) == 'undefined') {
console.log("登录失败");
} else {
var setCookie = result.headers['set-cookie'];
if (typeof(setCookie) == 'undefined') {
console.log("登录失败");
} else {
var cookie = setCookie[0] + ";" + setCookie[1];
ep.emit("cookie", cookie);
console.log(accountData.email+"登录成功");
}
}
});

用获取的cookie发帖

发帖时需要的数据方式也可以跟踪一个发帖过程获取,与登录不同的是需要添加新获取的cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ep.on("cookie", function(cookie) {
superagent
.post("http://youqu.de/topic/add")
.set(httpHeader)
.type('form')
.send(subData)
.set('Cookie', cookie)
.end(function(err, res) {
$ = cheerio.load(res.text);
var screenName = $('.screen-name a').text();
if(screenName.length >0 ){
console.log("成功");
console.log(screenName);
}
});
})

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
var EventProxy = require('eventproxy'),
superagent = require('superagent'),
cheerio = require('cheerio'),
baseUrl = 'http://youqu.de/login/';

//账户数据和模拟浏览器的Header
var accountData = {
email: 'ccccc@gmail.com',
password: 'ccccc',
remember: 'on',
from: '/'
},
httpHeader = {
'Content-Type': 'application/x-www-form-urlencoded',
Host: 'xxx.xxx',
Origin: 'http://xxx.xxx',
Referer: 'http://xxx.xxx/login/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0'
};

//发帖时提交的数据
var subData = {
title: '软绵绵的周日',
content: '软绵绵的周日'
}

var ep = new EventProxy();

//读取参数输入的账户数据
var arguments = process.argv.splice(2);
if (arguments.length == 2) {
accountData.email = arguments[0];
accountData.password = arguments[1];
}


//获取cookie
superagent
.post(baseUrl)
.set(httpHeader)
.type('form')
.send(accountData)
.redirects(0)
.end(function(err, result) {
if (typeof(result) == 'undefined') {
console.log("登录失败");
} else {
var setCookie = result.headers['set-cookie'];
if (typeof(setCookie) == 'undefined') {
console.log("登录失败");
} else {
var cookie = setCookie[0] + ";" + setCookie[1];
ep.emit("cookie", cookie);
console.log(accountData.email+"登录成功");
}
}
});

//用账户发帖
ep.on("cookie", function(cookie) {
superagent
.post("http://xxx.xx/topic/add")
.set(httpHeader)
.type('form')
.send(subData)
.set('Cookie', cookie)
.end(function(err, res) {
$ = cheerio.load(res.text);
var screenName = $('.screen-name a').text();
if(screenName.length >0 ){
console.log("成功");
console.log(screenName);
}
});
})
comments powered by Disqus
文章目錄
  1. 1. 模拟登录使用到的模块
  2. 2. 分析
    1. 2.1. 登录获取Cookie
    2. 2.2. 用获取的cookie发帖
  3. 3. 全部代码