Java数据采集-8.模拟登录

java模拟登录获取Cookie 关于java模拟登录获取Cookie时经历的坑springboot 引入jar包版本通过httpclient来模拟登录代码部分表单提交部分代码(未测试正确与否,只是找了前辈们的东西过来)总结 springboot 引入jar包版本 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> & 阅读详情

登录网址:https://passport.youkuaiyun.com/account/login?ref=toolbar
项目源码:https://github.com/geekfly2016/Spider
代码目录:Spider/src/xyz/geekfly/csdn/Login.java

当我们对某些网站进行一些特定操作时,如知乎的点赞,会要求我们登录,这时候一些简单的做法就是粘贴浏览器请求中的Cookie信息,但作为自动化的程序来讲,这个方法明显不可行。因此就有了模拟登录的需求。
注:至于Cookie是什么,在网页请求时有什么用,不在本文讨论范围,自行Google吧。


模拟登录一般分为以下几步:

  1. 获取登录的所需的信息
  2. 模拟提交账号信息,获取Cookie
  3. 携带Cookie进行目标操作

以优快云登录为例,详细介绍每一步如何操作和代码实现:
1. 获取登录的所需的信息
打开优快云,点击登录,即可看到登录页面,打开开发者工具。
这里写图片描述
注意先清空列表,勾选Preserve log(保持日志),这样点击登录跳转之后才能记录之前的请求。


输入自己的账号密码,点击登录,在第一个请求中我们可以看到登录请求所携带的参数,包括我们输入的用户名(username)和密码(password),但是发现还有几个其它参数。

这里写图片描述


再次退出,点击登录,查看表单发现存在这几个参数,因此模拟登录前需要获取这些参数。
这里写图片描述

方案是模拟登录前,先访问https://passport.youkuaiyun.com/account/login?ref=toolbar登录页面,使用Jsoup获取三个隐藏参数和表单提交的action(即为模拟登录的Url),保存以供下一步使用。
代码如下:

public static Map<String, String> getLoginInfo(){
        String login_url = "https://passport.youkuaiyun.com/account/login?ref=toolbar";
        String login_host = "https://passport.youkuaiyun.com"; //表单中获取的登录地址不带域名,需自行添加,拼接域名需注意‘/’,不要多加或漏加
        Map<String, String> return_data = new HashMap<String, String>();

        try {
            Document document = Jsoup.connect(login_url) 
                    .userAgent("ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36") 
                    .get();
            //获取登录的表单
            Elements element = document.select("#fm1");
//          System.out.println(element);

            //获取登录所需要的一些参数
            return_data.put("lt", element.select("input[name=lt]").attr("value"));//登录流水号
            return_data.put("execution", element.select("input[name=execution]").attr("value"));
            return_data.put("_eventId", element.select("input[name=_eventId]").attr("value"));

            //获取点击登录的请求地址
            return_data.put("action", login_host + element.attr("action"));
        }catch (IOException e) {
            e.printStackTrace();
        }
        return return_data;
    }

获取到的数据样例:

{   _eventId=submit,              action=https://passport.youkuaiyun.com/account/login;jsessionid=092BDD9C93EF4EE91917E080BE78981F.tomcat2?ref=toolbar, 
    lt=LT-508266-gPApMyjqezncjwuO3e02HDefS3Faa3,
    execution=e1s1
}

对于有些网站在分析之后,登录仅需要模拟点击登录所请求的Url带上用户信息即可,没有需要从登录页面获取参数的网站,不需要访问登录页面,只要找到模拟登录的Url即可。

2. 模拟提交账号信息,获取Cookie
在上一步点击登录后,可以在Response Headers中发现后台返回了很多参数,而在之后请求中,主要用到的也就是Cookie了,因此需要提取Cookie,而返回的又有很多个,需要自行拼接。
这里写图片描述


这里写图片描述

代码如下:

public static String getCookie(Map<String, String> data){
        String cookie = "";
        try{
            HttpClient httpClient = new DefaultHttpClient();

            HttpPost post = new HttpPost(data.get("action"));
            /* 模拟登录所需要的参数,有些网站登录时会检测,
                如果存在基本上为必须,但优快云发现并没有检测,故没有添加
                在Chrome开发者平台中可查看,粘贴过来即可
             */
//          post.setHeader("Host", "passport.youkuaiyun.com");
//          post.setHeader("Referer","https://passport.youkuaiyun.com/account/login?ref=toolbar");
//          post.setHeader("Origin", "https://passport.youkuaiyun.com");
//          post.setHeader("Content-Type","application/x-www-form-urlencoded");

            List<NameValuePair> params = new ArrayList<NameValuePair>();  

            //参数
            params.add(new BasicNameValuePair("lt", data.get("lt"))); 
            params.add(new BasicNameValuePair("execution", data.get("execution")));
            params.add(new BasicNameValuePair("_eventId", data.get("_eventId"))); 

            //用户名和密码(*号),替换为自己的
            params.add(new BasicNameValuePair("username", "******")); 
            params.add(new BasicNameValuePair("password", "*******"));

            post.setEntity(new UrlEncodedFormEntity(params,Consts.UTF_8));  
            HttpResponse response = httpClient.execute(post);
            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode != 200){
                System.out.print(statusCode);
            }
            Header[] map =  response.getAllHeaders();

            //如需查看所有的响应头,取消以下注释即可  
            /*System.out.println("显示响应Header信息\n");
            for (Header entry : map)
            {
                System.out.println("Key : " + entry.getName() + " ,Value : " + entry.getValue());
            }*/

            //对于登录,主要为获取响应头中的Cookie信息,拼接Cookie
            for (Header entry : map)
            {
                if(entry.getName().contains("Set-Cookie")){
                    cookie += entry.getValue() + ";";
                }
            }
            System.out.println("Cookie信息:" + cookie);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return cookie;
    }

3. 携带Cookie进行目标操作
在后续请求中,携带Cookie即可。

public static String getData(String target_url, String cookie){
        String result = null;
        try{
            HttpClient httpClient = new DefaultHttpClient();

            HttpGet httpGet = new HttpGet(target_url);

            //传入Cookie信息
            httpGet.setHeader("Cookie", cookie);

            HttpResponse response = httpClient.execute(httpGet);
            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode != 200){
                System.out.print(statusCode);
            }
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                result = EntityUtils.toString(entity, "utf-8");
            }

        }catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

主函数调度代码:

public static void main(String[] args) {
        //1. 获取登录所需的信息
        Map<String, String> login_info = getLoginInfo();

        //2. 模拟登录获取Cookie
        String cookie = getCookie(login_info);
        //3. 携带Cookie访问目标页(换成自己的)
        String target_url = "http://blog.youkuaiyun.com/tmaskboy";

        //携带登录获取的Cookie
        String result = getData(target_url, cookie);
        Document document = Jsoup.parse(result);
        System.out.println("携带Cookie:" + document.select(".navigator").text());

        //未携带Cookie
        String result1 = getData(target_url, "");
        Document document1 = Jsoup.parse(result1);
        System.out.println("未携带Cookie:" + document1.select(".navigator").text());
    }

运行演示:

Cookie信息:CASTGC=TGT-147082-YbG1A3MxGJHOZTDoHerLF9uAAbE6xiw2tKxc95RszTJ53OdE6U-passport.youkuaiyun.com; Path=/; Secure;UserName=TMaskBoy; Domain=.youkuaiyun.com; Path=/;UserInfo=NO45ahI1532jJLeoAla%2FybWeLRchb6M4TE4Hy5%2B%2FYjgBdIsumoYTKx%2FLZHKTQ1QUgmGrCjbEmwLO53SS6yLYwKp25%2BKY62REyhgEe3HX2drygMQJuAyjq7%2FYKrZG7tUJ; Domain=.youkuaiyun.com; Path=/;UserNick=geekfly; Domain=.youkuaiyun.com; Path=/;AU=2DB; Domain=.youkuaiyun.com; Path=/;UD=%E5%94%AF%E6%9C%89%E5%89%B2%E8%88%8D%EF%BC%8C%E6%89%8D%E8%83%BD%E4%B8%93%E6%B3%A8%E3%80%82%E5%94%AF%E6%9C%89%E6%94%BE%E5%BC%83%EF%BC%8C%E6%89%8D%E8%83%BD%E8%BF%BD%E6%B1%82%E3%80%82; Domain=.youkuaiyun.com; Path=/;UN=TMaskBoy; Domain=.youkuaiyun.com; Expires=Mon, 15-Oct-2018 09:09:30 GMT; Path=/;UE="geekfly@126.com"; Version=1; Domain=.youkuaiyun.com; Max-Age=31536000; Expires=Mon, 15-Oct-2018 09:09:30 GMT; Path=/;BT=1508058570894; Domain=.youkuaiyun.com; Expires=Mon, 15-Oct-2018 09:09:30 GMT; Path=/;access-token=65d8afcc-f6ee-44b2-afca-5d2dbed642f6; Domain=.youkuaiyun.com; Path=/;
携带Cookie:目录视图 摘要视图 订阅 管理博客 写新文章
未携带Cookie:目录视图 摘要视图 订阅

我们可以看到携带Cookie后,访问个人主页菜单栏包括了管理博客和写新文章,未携带Cookie则不包括,说明模拟登陆成功。
未登录


登录成功


后记:这里使用的是最简单的模拟登录案例了,稍复杂点的还有带验证码的,登录信息中跳转N次验证的,还有微信网页版那样的扫码验证的,骚年们,任重而道远,继续努力吧。

接下来这个专题写什么呢?

Java爬虫突破Facebook反爬:百万数据采集与法律边界实战指南 本文深入探讨了使用Java构建Facebook数据爬虫的实战技术,涵盖登录模拟、反反爬策略、分布式架构及百万级数据采集方案。同时,文章重点分析了数据爬取过程中的法律风险与合规边界,为开发者提供兼顾技术实现与法律安全的完整指南。 阅读详情

相关推荐

PC数据采集三支柱:API调用、网页解析与自动化模拟实战

数据采集是现代数据分析和AI应用的基础能力,其本质是通过标准化接口(API)、结构化文档(HTML/XML)或交互式行为(浏览器自动化)从目标系统中可靠获取原始数据。理解HTTP协议、DOM树解析原理与前端渲染机制,是构建稳定采集链路的前提;掌握认证鉴权、反爬适配与错误重试等工程实践,才能保障数据入口的可持续性。技术价值不仅在于‘能拿到’,更在于‘拿得稳、可维护、合规范’。典型应用场景包括市场竞品监控、学术文献追踪、本地生活数据聚合等。本文聚焦普通PC环境下的轻量级、高可控性方案,深度融合requests、

chiyingliao3565的博客 367

Java模拟浏览器访问url获取cookie

Java模拟浏览器访问url获取cookie

weixin_43652507的博客 3342

Android平台Java实现知乎登录爬虫实战项目

为了规避反爬机制,合理设置请求头和使用代理服务器至关重要。许多网站(包括知乎)会根据User-AgentReferer等字段判断请求是否来自真实用户。同时,频繁访问同一IP可能导致临时封禁,因此轮换代理成为必要手段。为解决上述限制,需创建文件:-- 允许所有域名使用明文流量 -->-- 针对特定域名启用SSL Pinning --></pin-set>并在中引用:... >

weixin_42584586的博客 3269

Java模拟cookie登陆操作

方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时时将cookie发送过去用以表明身份,这样就能够访问带有权限的URL了。思路即为:模拟登陆,取得cookie以记录身份,下次请求时发送cookie以表明身份。在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆。* 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ...//发送cookie信息上去,以表明自己的身份,否则会被认为没有权限。

Andyfu2019的博客 1367

JAVA通过Session和Cookie实现网站自动登录的技术

JAVA通过Session和Cookie实现网站自动登录的技术

实现cookie记住自动登录

1.代码是完整的导入到 myEclipse 中就可以使用 2.实现struts cookie 记住两周 自动登录功能 3.访问地址:http://127.0.0.1:8080/cookie/index.jsp 4.系统默认有两个账户 在 UserDao 中可以查到

Java爬虫模拟登录-----用HttpClient模拟登录优快云,用jsoup解析

我是怀着无比激动的心情写下的这篇文章,搞了我一周多终于算是成功的模拟了登录。我是在看这位博主的一篇博客以后,对他的代码做了部分改动,才弄好的大家赶紧去看啊,晚了就没了。 我先说怎么改的,省的有些人性子急,看不下去。 文中提到的博主的项目没有使用maven的形式,而是采用了jar包,我down下来他的代码,运行以后,控制台报错,一个是SSL的错,一个就是说jsoup.parse方法,解析了空数据。我...

dashuaixv的博客 1160

java模拟http请求登陆抓取海投网信息

java模拟http请求登陆抓取海投网信息送入到mysql数据库,特别注意的是需要配置mysql为gbk 或者utf-8

Javaweb模拟登录

数据库连接,request,response请求,get,post提交

coffee_0308的博客 623

Java 模拟cookie登陆简单操作示例

主要介绍了Java 模拟cookie登陆简单操作,结合实例形式分析了Java 模拟cookie登陆的相关原理与基本实现技巧,需要的朋友可以参考下

JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

不需要填写用户名和密码自动登录系统,其实现思路使用cookie模拟浏览器自动登录,对cookie实现自动登录功能感兴趣的朋友一起学习吧

selenium 实现模拟登录中的滑块验证功能

用python在做数据采集过程中,经常需要用到模拟登录,经常遇到各种图片、文字甚至短信等验证,如果能通过脚本的方便实现验证,就可以自动帮我更高效地收集数据。它支持多种编程语言(如 Python、Java、C# 等),能够模拟用户在浏览器中的操作,如点击、输入、滚动等。Selenium 的核心组件是 WebDriver,它通过浏览器驱动(如 ChromeDriver、GeckoDriver)与浏览器进行交互。将图像识别与拖动操作结合使用,可应对更复杂的滑块验证场景。步骤 5:生成模拟人类拖动的轨迹。

网络风云的博客 2万+

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

java怎么模拟form表单提交

Java模拟Form表单提交 在Web开发中,表单提交是一种常见的数据交互方式。有时,我们可能需要在Java程序中模拟浏览器提交表单,以实现自动化测试或数据采集等功能。本文将介绍如何使用Java模拟Form表单提交,并提供一个实际示例。 准备工作 在开始之前,我们需要准备以下工具和库: JDK(Java Developm...

weixin_29962351的博客 799

竞拍算法(Auction Algorithm)原理及工作过程分析

因一些项目工作需要对竞拍算法进行深入了解。但百度了大部分资料都未找到一篇文章能对此算法进行较为深入的介绍。在一番努力之下,终于找打了最初提出该算法的论文,本文内容主要结合该论文对竞拍算法进行分析。 竞拍算法简介 竞拍算法(Auction Algorithm)是一种用于解决分配问题的分布式算法,经相关文献查询,最早由麻省理工学院信息和决策系统实验室的Bertsekas(教授?)提出 1,于1988年发表于期刊Annals of Operations Research。 顾名思义,竞拍算法本质就是模拟人类拍.

weixin_47546390的博客 3万+

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6083

Android(Java) 模拟登录知乎并抓取用户信息

前不久。看到一篇文章我用爬虫一天时间“偷了”知乎一百万用户。仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的。仅仅是简单的介绍使用java来进行模拟登录的基本过程。之前写过的文章android 项目实战——打造超级课程表一键提取课表功能事实上就是模拟登录的范畴。再加上近期在知乎上看到非常多人问关于超级课程表的实...

weixin_34255055的博客 113

【华为OD技术面】 - 考到的Lettcode手撕算法代码真题目录

【华为OD技术面 - 考到的Lettcode手撕算法代码真题目录

算法大师! 7810

绕过前端校验:一个Java脚本通杀QQ登录的会员资源爬虫实战

本文深入解析了OAuth2.0协议在第三方登录中的应用,特别是QQ登录的授权流程。通过Java实现自动化登录方案,包括关键参数获取、验证码识别和请求频率控制,为开发者提供了一套绕过前端校验的通用爬虫实践。文章还强调了安全与合规的重要性,确保数据采集的合法性和安全性。

weixin_30808693的博客 577

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 207

VMware报错系列:虚拟机配置文件(.vmx)损坏或丢失---修复

虚拟机配置文件(.vmx)损坏或丢失---修复

weixin_54626591的博客 7011

RPA-Python与Facebook集成:社交数据采集与分析全指南

在当今数字化时代,社交媒体平台已成为海量用户数据的宝库。Facebook作为全球最大的社交网络,拥有超过28亿月活跃用户,其数据蕴含着巨大的商业价值。然而,手动从Facebook采集和分析数据不仅耗时耗力,还面临着诸多挑战: - 数据量大且分散,难以全面收集 - 界面频繁更新,传统爬虫容易失效 - 反爬机制严格,容易触发账号风险 - 数据格式不统一,分析难度大 RPA-Python(Robot...

gitblog_00005的博客 2084

C++性能优化:深入理解缓存一致性与伪共享

在现代多核处理器的世界里,理解缓存一致性和伪共享就像理解一个复杂社会系统的运作规则。正如心理学家阿德勒所说:"人的行为总是有目的的",CPU缓存的每一次同步也都有其深层的硬件逻辑。本文将带你深入探索这些看不见的性能杀手,以及如何在实际项目中与它们优雅共处。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 934

Java数据采集--1.准备工作

前言:自从2014年4月大一开始接触Java,7月开始接触网络爬虫至今已经两年的时间,共抓取非同类型网站150余个,其中包括一些超大型网站,比如百度文库,亚马逊,魔方格,学科网等。也在学长五年经验留下来的代码的基础上,整合成一个小型的爬虫框架,主要用于抓取期刊之类的数据型网站,包括元数据抓取和文件下载。在此感谢曾经给我指导方向,帮助我学习的学长们。关于本系列博文:主要基于Java语言,使用Jsoup

geekfly的Blog 5540

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 297

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大数据数据采集,从菜鸟到高手的进阶之路

菜鸟期的重点是**“用起来”**——不要纠结于“哪个工具更高级”,先学会用Scrapy爬静态网页,用Flume收日志,用Sqoop同步数据库。等这些工具用熟了,再去学更复杂的技术。小目标:用Scrapy爬取一个博客网站的100篇文章,用Flume收集自己电脑上的日志文件(比如),用Sqoop同步MySQL的一个表到Hive。CDC(Change Data Capture,变更数据捕获)是一种捕获数据库变更的技术(比如插入、更新、删除操作),并将这些变更实时传输到下游系统(比如Kafka、Flink)。优势。

AI算力网络与通信的博客 2885

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 传智播客_Springmvc+Mybatis由浅入深全套视频教程+文档
下一篇: Git免密码登录
geekfly
博客等级 码龄12年 149粉丝 101原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值