6 回复
我告诉你怎么登陆吧。。。
- 用 chrome 进行登陆
- 把 chrome 中的 cookie 字符串保存下来
- 再每次发请求的时候,header 中设置一下 cookie 就好
不要去做什么自动填表单!登陆只是一次性工作!在外面做了就好!
cookie的部分直接用cookie jar来管理吧, request模块(https://github.com/request/request)就提供了这样的选项:
jar - If true and tough-cookie is installed, remember cookies for future use (or define your custom cookie jar; see examples section)
这个不是很困难吧,登录成功后,将服务器响应中的Set-Cookie的值保存到一个变量(不要使用局部变量),然后接下来的请求每次都加上一个请求头Cookie,值就是你前面保存的cookie的值就可以了。
var opton1={
method:"POST",
host:"",//服务器主机Ip,填域名也行
port:"",//http服务器的端口一般是80,IEEE默认的
path:"",//登陆信息的提交目的地,我爬教务处的时候是/LoginAction.do,相当于form的action
headers:{
"Content-Type":"application/x-www-form-urlencoded",
"Content-length":userInfo.length//userInfo是登陆填的信息,userInfo=query.stringify({"name":" ","password":" "}),感觉用JSON.stringify也没问题, name和password这俩个键名因网站而异,就是form里面input的name属性值
}
}
var request1=http.request(option1);
request1.write(userInfo);
request1.end();
request1.on("error",functon(e){.......});
request1.on("response",function(respnse){
//这里的话,response就会包含返回的cookie,但是我不知道如果这里有重定向该怎么做
var option2={
method:"GET",
host:"",
port:"",
path:"",//目标页面
headers:{
"cookie":response.headers["set-cookie"].toString()//这个就是cookie,可以用util解析一下response.headers,看看里面到底有什么
}
}
var request2=http.request(option2);
request2.end();
request2.on("error",function(e){......});
request2.on("response",function(response2){
var wr=fs.createWriteStream("./output.txt");
response2.pipe(wr);//这样output.txt里面就是目标页面的html文档了
//也可以监听data事件
//response2.on("data",function(data){});
//response2.on("end",function(){..})
})
})
这几行代码应该可以拿到目标页面的html文档内容,我自己也有几个地方没搞明白,就是怎么处理重定向问题,还有为什么我的MAC地址被教务处封了1个星期。。。。。,我有敲代码去注销登陆啊。有同等经历的同学还请搭救一下 ><