java爬虫教程:模拟用户表单登录

article/2025/8/27 8:21:46

转自:http://xiaolongonly.cn/2016/06/01/Reptile3/

这个是爬虫教程第三篇,教大家如何模拟用户表单登录。

前期准备:

JSOUP 1.83 jar包
Eclipse 任意版本能运行java就行
谷歌浏览器
第一步:依然是分析页面结构

我们要模拟CSDN用户表单登录,来获取用户登录后的数据。
在一些网站和论坛,部分内容总是需要会员用户等需要一定权限的用户才能看得到。
好了由此可见模拟用户表单登录的重要性了。

进入登录页,在页面上按F12查看页面元素的内容。
这里写图片描述

这次我们只要form标签,和其内部的账号密码输入框信息。

第二步:讲解一下Post需要的操作具体流程

一般表单的id都是唯一的,所以要过滤出表单是很容易的一件事情
这里表单的id值是fm1

List<Element> et = d1.select("#fm1");// 获取form表单

下一步是获得表单下面的帐号和密码输入框控件,同样可以根据id来过滤,不过这里使用的是name属性。
一般网站设计都会把name属性配上value,post到服务端。
直接在Map对象中put帐号和密码的键值对,代码如下

Map<String, String> datas = new HashMap<>();
datas.put(e.attr("name"), e.attr("value"));

这个就是表单的帐号密码输入框的键值
也可以不做遍历直接

datas.put("username", "your username");
datas.put("password", "your password");

哈哈,是不是少了许多。
经过这一步之后datas里已经存放了我们要post的数据了。
可以执行第二次请求将登录信息post上去了。
Response login = con2.ignoreContentType(true).method(Method.POST)
.data(datas).cookies(rs.cookies()).execute();
携带登录的Map数据和第一次登录返回的cookie,进行post。

第三步:开始写代码

好了就是这么简单。接下来看看代码吧。

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
/*** 使用Jsoup模拟登陆CSDN* * * 大体思路如下:* * 第一次请求登陆页面,获取页面信息,包含表单信息,和cookie(这个很重要),拿不到,会模拟登陆不上* * * 第二次登陆,设置用户名,密码,把第一次的cooking,放进去,即可* * 怎么确定是否登陆成功?* * 登陆后,打印页面,会看到账户的详细信息。* * * @date 2016年6月13日* @author xiaolong* * * **/
public class LoginDemo {public static void main(String[] args) throws Exception {LoginDemo loginDemo = new LoginDemo();loginDemo.login("your account", "password");// 输入CSDN的用户名,和密码}/*** 模拟登陆CSDN* * @param userName*            用户名* @param pwd*            密码* * **/public void login(String userName, String pwd) throws Exception {// 第一次请求Connection con = Jsoup.connect("https://passport.csdn.net/account/login");// 获取连接con.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");// 配置模拟浏览器Response rs = con.execute();// 获取响应Document d1 = Jsoup.parse(rs.body());// 转换为Dom树List<Element> et = d1.select("#fm1");// 获取form表单,可以通过查看页面源码代码得知// 获取,cooking和表单属性,下面map存放post时的数据Map<String, String> datas = new HashMap<>();for (Element e : et.get(0).getAllElements()) {if (e.attr("name").equals("username")) {e.attr("value", userName);// 设置用户名}if (e.attr("name").equals("password")) {e.attr("value", pwd); // 设置用户密码}if (e.attr("name").length() > 0) {// 排除空值表单属性datas.put(e.attr("name"), e.attr("value"));}}/*** 第二次请求,post表单数据,以及cookie信息* * **/Connection con2 = Jsoup.connect("https://passport.csdn.net/account/login");con2.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");// 设置cookie和post上面的map数据Response login = con2.ignoreContentType(true).method(Method.POST).data(datas).cookies(rs.cookies()).execute();// 打印,登陆成功后的信息System.out.println(login.body());// 登陆成功后的cookie信息,可以保存到本地,以后登陆时,只需一次登陆即可Map<String, String> map = login.cookies();for (String s : map.keySet()) {System.out.println(s + "      " + map.get(s));}}
}

总结

这个类中写了两次网站访问的请求
第一次请求用来获取cookie信息
第二次请求将携带cookie和登录数据的信息post出去用来模拟登录。
就是这么简单~~~小Tips:
想要模拟用户表单登录,链接头信息是不可少的,"User-Agent"代表的是浏览器访问信息。
通过下图可以看到请求头可以有这么多的信息,
服务端可能会通过约束请求头来判别用户post/get的信息是否合法
所以请求头很重要~请求头很重要~请求头很重要~(重要的事情说三遍)

这里写图片描述

这个是登录后每一次操作都需要携带的头部信息。可以通过F12查看页面网络访问状态来查看请求头和返回头。
好啦,有了模拟表单登录了,是时候去大展身手了。
爬虫教程到此结束,希望有兴趣的小伙伴可以继续深入研究

http://chatgpt.dhexx.cn/article/ymZZs37G.shtml

相关文章

REmap包介绍及使用

2019独角兽企业重金招聘Python工程师标准>>> #REmap包简介 #包安装 #remapH函数 #remapH案例 #get_theme函数 #remapC函数 #markLineControl函数 #markPointControl函数 #remapC案例 REmap包简介 REmap包是R与echart的对接&#xff0c;在R里调用echar的api直接作图&…

用R语言绘制动态地图,代码奉上!(REmap包详解)

options(remap.ak="MY07CLhm3wKi4N2tQ6WP4kzz21BBZagI") 安装包 library(devtools) install_github(badbye/baidumap) install_github(lchiffon/REmap) baidumap包函数说明 getBaiduMap函数 getBaiduMap(location, width = 400, height = 400, zoom = 10, scale = …

remap()

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

REmap绘制地图

本文出自&#xff1a; http://blog.csdn.net/wzgl__wh/article/details/53108754 REmap这个包是通过调用百度地图API的一个程序包&#xff0c;与Google的ggmap包相比&#xff0c;不用翻墙就可以使用。其函数主要有&#xff1a;remap()&#xff0c;remapB()、remapC()、remapH()…

R语言:使用REmap绘制超炫酷的地图

REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()四个。该程序包目前要github网站上,因此我们需要从github上面下载安装。 install.packages("devtools")#如果安装…

ioremap()

活动地址&#xff1a;CSDN21天学习挑战赛 前言 之前&#xff0c;我们使用 devmem 命令的方式&#xff0c;直接操作寄存器&#xff0c;控制 LED 的亮灭。 今天&#xff0c;我们在内核中使用 ioremap() 来实现该功能。 物理地址 vs 虚拟地址 在嵌入式 Linux 中&#xff0c;通常…

STM32和GD32的GPIO引脚的default(默认) alternate(引脚复用) remap(引脚重映射)三种用法 别把复用和重映射当一回事儿

STM32有很多内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用 重映射就是引脚重映射&#xff0c;本来每个内置外设都有原来设…

OpenCV函数remap详解

OpenCV函数remap详解 remap的作用是将原影像映射到目标影像的函数。 这是OpenCV文档中的说明。 但这个描述给人的感觉是&#xff0c;云里雾里&#xff0c;到底是需要计算目标到原的映射关系&#xff0c;还是原到目标的映射呢。 经过我的实验发现是需要给出目标到原的映射关系…

remap函数

cvRemap( img1, img1r, mx1, my1 );在这个函数中mx1、my1是由前面函数计算出的校正系数&#xff0c;其指明了具体像素重新分配的位置。在learning opencv的12.3自带程序中可以发现&#xff0c;一般来说my1的值是比较集中的&#xff0c;mx1的值是比较分散的&#xff0c;这满足基…

Python-OpenCV 的 remap函数

恒等映射 result_img 和 原图一模一样 import cv2 import numpy as npimg cv2.imread("OpenCV.png") rows, cols, ch img.shape mapx np.ones(img.shape[:2], np.float32) mapy np.ones(img.shape[:2], np.float32) for i in range(rows):for j in range(cols)…

STM32重映射(Remap)

STM32重映射&#xff08;Remap&#xff09; 在外设的初始化中默认为Default重映射函数复用功能 在外设的初始化中默认为Default 在参考手册中 均有USART1的功能&#xff0c;但是若是想要用PB6与PB7作为USART1_TX与USART1_RX则需要用到重映射。 使用PA9 PA10只需要直接配置就…

Opencv remap函数

Opencv remap函数 函数签名实例应用亚像素信息扭曲特效 函数签名 void cv::remap ( InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode BORDER_CONSTANT, const Scalar & borderValue Scalar() ) 将通用几何变换…

OpenCV图像处理——重映射 remap函数

在《学习OpenCV3&#xff0c;OReilly系列丛书》中的第11章常见的图像变换中讲到的“任意映射”&#xff0c;Remap函数。函数cv::remap通常用来纠正校准的立体图像&#xff0c;包括图像变形和图像扭曲。其实这个函数在无人机拍摄延时摄影&#xff08;使用电子防抖算法&#xff0…

重映射:remap()函数

remap()函数会根据指定的映射形式&#xff0c;将原图像进行重映射几何变换&#xff0c;基于公式如下&#xff1a; dst(x, y) src( mapx(x, y), mapy(x, y) )函数原型C&#xff08;程序 / 20&#xff09;: void remap( InputArray src, OutputArray dst, InputArray map1, In…

OpenCV:remap()简单重映射

学习自&#xff1a;【OpenCV入门教程之十七】OpenCV重映射 重映射&#xff0c;就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

JS获取对象键值对中key值的方法

使用Object.keys Object.keys( ) 会返回一个数组&#xff0c;数组中是这个对象的key值列表 所以只要Object.keys(a)[0]&#xff0c; 就可以得只包含一个键值对的key值 下面是MDN中对Object.keys的描述 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组&…

C# 键值对

1.初始化一个键值对 1 //初始化定义一个键值对&#xff0c;注意最后的括号 2 Dictionary<int, string> dic new Dictionary<int, string>(); 2.为键值对添加元素 1 //键值对的Add函数 2 dic.Add(2, "zhao"); 3 dic.Add(4, "qian"); 4 dic…

js中往数组对象中添加键值对的方法有哪些?

❤️❤️❤️Topology-le5le智慧光伏能源可视化方案❤️❤️❤️ &#x1f31f;&#x1f31f;&#x1f31f;Topology可视化绘图引擎&#x1f31f;&#x1f31f;&#x1f31f; 1.Object.assign() 用法&#xff1a;Object.assign(源对象, {要添加的键值对}) 2.拓展运算符&…

键值对操作

键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始 ETL(抽取、转化、装载)操作来将数据转化为键值对形式。键值对 RDD 提供了一些新的操作接口(比如统计每个产品的评论,将数据中键相同的分为一组,将两个不同的 RDD 进行分组合并等)。 1. 动机 Spark 为包含键值对类…

java键值对的使用

Map集合没有继承Collection接口&#xff0c;但是其提供了key到value的映射。每一个key不能有相同&#xff0c;每个key只能映射一个value值。 Map接口常用方法&#xff1a; 方法功能描述put(K key, V value)向集合中添加指定的key与value的映射关系containsKey(Object key)如果…