利用Jsoup模拟跳过登录爬虫获取数据
今天在学习爬虫的时候想着学习一下利用jsoup模拟登录。下面分为有验证码和无验证码的情况进行讨论。
---------------------------无验证码的情况----------------------------
1.我们正常利用网页进行登录,利用浏览器自带的开发者工具查看一些登录信息

我们登录的时候需要携带自己的身份信息,也就是用户名和密码。也会携带一些浏览器的信息,所以我们可以通过Jsoup伪造一些请求头,并写到自己的身份信息去登录,然后获取登录后返回的cookie,cookie中会包含session,有了sessionid我们就可以爬取登录之后可以访问的url。
2.Jsoup伪造请求头且携带身份信息获取登录信息
/**
* 模拟登录获取cookie和sessionid
*/
public static void login() throws IOException {
String urlLogin = "http://qiaoliqiang.cn/Exam/user_login.action";
Connection connect = Jsoup.connect(urlLogin);
// 伪造请求头
connect.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding",
"gzip, deflate");
connect.header("Accept-Language", "zh-CN,zh;q=0.9").header("Connection", "keep-alive");
connect.header("Content-Length", "72").header("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
connect.header("Host", "qiaoliqiang.cn").header("Referer", "http://qiaoliqiang.cn/Exam/");
connect.header("User-Agent",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
.header("X-Requested-With", "XMLHttpRequest"); // 携带登陆信息
connect.data("username", "362501197407067215").data("password", "123456").data("user_type", "2")
.data("isRememberme", "yes"); //请求url获取响应信息
Response res = connect.ignoreContentType(true).method(Method.POST).execute();// 执行请求
// 获取返回的cookie
Map<String, String> cookies = res.cookies();
for (Entry<String, String> entry : cookies.entrySet()) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
System.out.println("---------华丽的分割线-----------");
String body = res.body();// 获取响应体
System.out.println(body);
}
结果:
logininfo-"362501197407067215,123456"
JSESSIONID-75ad3bad-30cd-4d7a-8918-b13054f4b737
rememberMe-deleteMe
---------华丽的分割线-----------
{"login_result":"success_manager","user_type":"2","login_url":"examParper\/examPaper\/examparperManage.jsp"}
反例:
此时我们将身份信息的密码改成错误密码:
// 携带登陆信息
connect.data("username", "362501197407067215").data("password", "123").data("user_type", "2")
.data("isRememberme", "yes");
结果:
---------华丽的分割线-----------
{"login_result":"error002","user_type":"2","login_url":null}
3.在上述获取cookie的基础上模拟访问网站登录可以访问的网址
将cookies定义为一个全局变量cookies,当我们访问登录可以访问的url的时候带着cookies去访问。
package cn.qlq.craw.Jsoup; import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry; import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; /**
* 模拟Jsoup跳过登陆进行爬虫
*
* @author liqiang
*
*/
public class JsoupCookieCraw {
private static Map<String, String> cookies = null; public static void main(String[] args) throws IOException {
// 先模拟登录获取到cookie和sessionid并存到全局变量cookies中
login(); String url = "http://qiaoliqiang.cn/Exam/view/testPerson/outEmployeeAllot.jsp";
// 直接获取DOM树,带着cookies去获取
Document document = Jsoup.connect(url).cookies(cookies).post();
System.out.println(document.toString());
} /**
* 模拟登录获取cookie和sessionid
*/
public static void login() throws IOException {
String urlLogin = "http://qiaoliqiang.cn/Exam/user_login.action";
Connection connect = Jsoup.connect(urlLogin);
// 伪造请求头
connect.header("Accept", "application/json, text/javascript, */*; q=0.01").header("Accept-Encoding",
"gzip, deflate");
connect.header("Accept-Language", "zh-CN,zh;q=0.9").header("Connection", "keep-alive");
connect.header("Content-Length", "72").header("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
connect.header("Host", "qiaoliqiang.cn").header("Referer", "http://qiaoliqiang.cn/Exam/");
connect.header("User-Agent",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
.header("X-Requested-With", "XMLHttpRequest"); // 携带登陆信息
connect.data("username", "362501197407067215").data("password", "123456").data("user_type", "2")
.data("isRememberme", "yes"); //请求url获取响应信息
Response res = connect.ignoreContentType(true).method(Method.POST).execute();// 执行请求
// 获取返回的cookie
cookies = res.cookies();
} }
结果:(可以获取到我们访问的页面的内容)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>分配员工</title>
.....................
反例:
我们将登录方法去掉,同时访问的时候不携带cookies:
public static void main(String[] args) throws IOException {
String url = "http://qiaoliqiang.cn/Exam/view/testPerson/outEmployeeAllot.jsp";
// 直接获取DOM树,带着cookies去获取
Document document = Jsoup.connect(url).post();
System.out.println(document.toString());
}
结果:(我们访问到的是系统的主页,也就是登录界面,发现我们被拦在网站外面)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>主页</title>
.....
总结:
不带验证码的登录利用上面的模拟登录的方法基本能满足要求。
---------------------------带验证码的情况----------------------------
利用Jsoup模拟跳过登录爬虫获取数据的更多相关文章
- 利用phantomjs模拟QQ自动登录
之前为了抓取兴趣部落里的数据,研究了下QQ自动登录. 当时搜索了一番,发现大部分方法都已经失效了,于是准备自己开搞. 第一个想到的就是参考网上已有方案的做法,梳理登陆js的实现,通过其他语言重写.考虑 ...
- 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据
1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...
- PHP模拟登录并获取数据
cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...
- PHP中使用CURL模拟登录并获取数据实例
cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...
- 利用insert,update和delete注入获取数据
0x00 简介 利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询.报错.布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的.那么,当我们发现了一个基于i ...
- nodeJs爬虫获取数据
var http=require('http'); var cheerio=require('cheerio');//页面获取到的数据模块 var url='http://www.jcpeixun.c ...
- HttpWebRequest 模拟网站登录获取数据
此文档仅仅是一个BaseCode,已做后续查阅 项目使用IBM Platform Symphony分布式平台,所有业务处理都在这个分布式平台上计算,需求是获取这些计算机机群的运行状态,和每一个服务的的 ...
- 在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识
我的新书,<基于股票大数据分析的Python入门实战>,预计将于2019年底在清华出版社出版. 如果大家对大数据分析有兴趣,又想学习Python,这本书是一本不错的选择.从知识体系上来看, ...
- Python3之利用Cookie模拟登录
Python3之利用Cookie模拟登录 利用Cookie模拟登录步骤: 1. 在浏览器输入http://demo.bxcker.com,输入用户名和密码登录. 2.登录成功点" ...
随机推荐
- python之enumerate()学习
X = 'abcdefghijklmn' for (index,char) in enumerate(X): print (index, char) 利用enumerate()函数,可以在每次循环中同 ...
- click()、bind()、live()和delegate()方法
我之前使用click()比较多,又来因为网页内容需要前端生成用了live().有的时候使用click()和bind()分不清楚该怎么试用.查了很多资料.测试了很多次,自己明白了. 总结如下:代码注释很 ...
- windows200364位iis6 php环境搭建
最近接一个小活,就是帮着部署个php网站,服务器是window2003,iis6.之前在我自己得服务器上已经搭建过php环境,区别是我的服务器windows2012,而对方的是windows 2003 ...
- 【CodeChef】Chef and Graph Queries
Portal --> CC Chef and Graph Queries Solution 快乐数据结构题(然而好像有十分优秀的莫队+可撤销并查集搞法qwq) 首先考虑一种方式来方便一点地..计 ...
- ASCLL表
ASCII码表完整版 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 ...
- python创建多维列表
By francis_hao Mar 24,2018 "*"操作符可以用于列表,表示将列表内容重复n次.如下, 但是当列表内容是列表的时候就出问题了,如果我只是修改多 ...
- css美化Div边框的样式实例
很多时候如果不是用了很多样式,很难把边框修饰得好看,看了一篇博文,觉得真的挺漂亮,也挺好看. 转载的博文地址 将这段美化的css代码 border:1px solid #96c2f1;backgrou ...
- Linux HugePage 特性
HugePage,就是指的大页内存管理方式.与传统的4kb的普通页管理方式相比,HugePage为管理大内存(8GB以上)更为高效.本文描述了什么是HugePage,以及HugePage的一些特性. ...
- Qt ------ QElapsedTimer 计算消耗多少时间
The QElapsedTimer class provides a fast way to calculate elapsed times. The QElapsedTimer class is u ...
- Scratch编程小案例:愤怒的小牛
愤怒的小鸟曾经很热门,网上还说他是程序员最喜欢玩的游戏.最先我是WIKIOI的评测页面看到他的,后来在2014年全国信息学奥林匹克联赛第一天第三题飞扬的小鸟也看到了它.因此,突然想做一个类似愤怒的小鸟 ...