Java 爬虫遇到需要登录的网站,该怎么办?

news/2024/5/13 6:30:47/文章来源:https://blog.csdn.net/u013310119/article/details/105142747

在做爬虫时,遇到需要登陆的问题也比较常见,比如写脚本抢票之类的,但凡需要个人信息的都需要登陆,对于这类问题主要有两种解决方式:一种方式是手动设置 cookie ,就是先在网站上面登录,复制登陆后的 cookies ,在爬虫程序中手动设置 HTTP 请求中的 Cookie 属性,这种方式适用于采集频次不高、采集周期短,因为 cookie 会失效,如果长期采集的话就需要频繁设置 cookie,这不是一种可行的办法,第二种方式就是使用程序模拟登陆,通过模拟登陆获取到 cookies,这种方式适用于长期采集该网站,因为每次采集都会先登陆,这样就不需要担心 cookie 过期的问题。

为了能让大家更好的理解这两种方式的运用,我以获取豆瓣个人主页昵称为例,分别用这两种方式来获取需要登陆后才能看到的信息。获取信息如下图所示:


获取图片中的缺心眼那叫单纯,这个信息显然是需要登陆后才能看到的,这就符合我们的主题啦。接下来分别用上面两种办法来解决这个问题。

手动设置 cookie 的方式,这种方式比较简单,我们只需要在豆瓣网上登陆,登陆成功后就可以获取到带有用户信息的cookie,豆瓣网登录链接:https://accounts.douban.com/passport/login。如下图所示:

图中的这个 cookie 就携带了用户信息,我们只需要在请求时携带这个 cookie 就可以查看到需要登陆后才能查看到的信息。我们用 Jsoup 来模拟一下手动设置 cookie 方式,具体代码如下:

/*** 手动设置 cookies* 先从网站上登录,然后查看 request headers 里面的 cookies* @param url* @throws IOException*/
public void setCookies(String url) throws IOException {Document document = Jsoup.connect(url)// 手动设置cookies.header("Cookie", "your cookies").get();//if (document != null) {// 获取豆瓣昵称节点Element element = document.select(".info h1").first();if (element == null) {System.out.println("没有找到 .info h1 标签");return;}// 取出豆瓣节点昵称String userName = element.ownText();System.out.println("豆瓣我的网名为:" + userName);} else {System.out.println("出错啦!!!!!");}
}

从代码中可以看出跟不需要登陆的网站没什么区别,只是多了一个.header("Cookie", "your cookies"),我们把浏览器中的 cookie 复制到这里即可,编写 main 方法

public static void main(String[] args) throws Exception {// 个人中心urlString user_info_url = "https://www.douban.com/people/150968577/";new CrawleLogin().setCookies(user_info_url);

运行 main 得到结果如下:

可以看出我们成功获取到了缺心眼那叫单纯,这说明我们设置的 cookie 是有效的,成功的拿到了需要登陆的数据。这种方式是真的比较简单,唯一的不足就是需要频繁的更换 cookie,因为 cookie 会失效,这让你使用起来就不是很爽啦。

模拟登陆方式

模拟登陆的方式可以解决手动设置 cookie 方式的不足之处,但同时也引入了比较复杂的问题,现在的验证码形形色色、五花八门,很多都富有挑战性,比如在一堆图片中操作某类图片,这个还是非常有难度,不是随便就能够编写出来。所以对于使用哪种方式这个就需要开发者自己去衡量利弊啦。今天我们用到的豆瓣网,在登陆的时候就没有验证码,对于这种没有验证码的还是比较简单的,关于模拟登陆方式最重要的就是找到真正的登陆请求、登陆需要的参数。 这个我们就只能取巧了,我们先在登陆界面输入错误的账号密码,这样页面将不会跳转,所以我们就能够轻而易举的找到登陆请求。我来演示一下豆瓣网登陆查找登陆链接,我们在登陆界面输入错误的用户名和密码,点击登陆后,在 network 查看发起的请求链接,如下图所示:

从 network 中我们可以查看到豆瓣网的登陆链接为https://accounts.douban.com/j/mobile/login/basic,需要的参数有五个,具体参数查看图中的 Form Data,有了这些之后,我们就能够构造请求模拟登陆啦。登陆后进行后续操作,接下来我们就用 Jsoup 来模拟登陆到获取豆瓣主页昵称,具体代码如下:

/*** Jsoup 模拟登录豆瓣 访问个人中心* 在豆瓣登录时先输入一个错误的账号密码,查看到登录所需要的参数* 先构造登录请求参数,成功后获取到cookies* 设置request cookies,再次请求* @param loginUrl 登录url* @param userInfoUrl 个人中心url* @throws IOException*/
public void jsoupLogin(String loginUrl,String userInfoUrl)  throws IOException {// 构造登陆参数Map<String,String> data = new HashMap<>();data.put("name","your_account");data.put("password","your_password");data.put("remember","false");data.put("ticket","");data.put("ck","");Connection.Response login = Jsoup.connect(loginUrl).ignoreContentType(true) // 忽略类型验证.followRedirects(false) // 禁止重定向.postDataCharset("utf-8").header("Upgrade-Insecure-Requests","1").header("Accept","application/json").header("Content-Type","application/x-www-form-urlencoded").header("X-Requested-With","XMLHttpRequest").header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36").data(data).method(Connection.Method.POST).execute();login.charset("UTF-8");// login 中已经获取到登录成功之后的cookies// 构造访问个人中心的请求Document document = Jsoup.connect(userInfoUrl)// 取出login对象里面的cookies.cookies(login.cookies()).get();if (document != null) {Element element = document.select(".info h1").first();if (element == null) {System.out.println("没有找到 .info h1 标签");return;}String userName = element.ownText();System.out.println("豆瓣我的网名为:" + userName);} else {System.out.println("出错啦!!!!!");}
}

这段代码分两段,前一段是模拟登陆,后一段是解析豆瓣主页,在这段代码中发起了两次请求,第一次请求是模拟登陆获取到 cookie,第二次请求时携带第一次模拟登陆后获取的cookie,这样也可以访问需要登陆的页面,修改 main 方法

public static void main(String[] args) throws Exception {// 个人中心urlString user_info_url = "https://www.douban.com/people/150968577/";// 登陆接口String login_url = "https://accounts.douban.com/j/mobile/login/basic";// new CrawleLogin().setCookies(user_info_url);new CrawleLogin().jsoupLogin(login_url,user_info_url);
}

运行 main 方法,得到如下结果:

模拟登陆的方式也成功的获取到了网名缺心眼那叫单纯,虽然这已经是最简单的模拟登陆啦,从代码量上就可以看出它比设置 cookie 要复杂很多,对于其他有验证码的登陆,我就不在这里介绍了,第一是我在这方面也没什么经验,第二是这个实现起来比较复杂,会涉及到一些算法和一些辅助工具的使用,有兴趣的朋友可以参考崔庆才老师的博客研究研究。模拟登陆写起来虽然比较复杂,但是只要你编写好之后,你就能够一劳永逸,如果你需要长期采集需要登陆的信息,这个还是值得你的做的。

除了使用 jsoup 模拟登陆外,我们还可以使用 httpclient 模拟登陆,httpclient 模拟登陆没有 Jsoup 那么复杂,因为 httpclient 能够像浏览器一样保存 session 会话,这样登陆之后就保存下了 cookie ,在同一个 httpclient 内请求就会带上 cookie 啦。httpclient 模拟登陆代码如下:

/*** httpclient 的方式模拟登录豆瓣* httpclient 跟jsoup差不多,不同的地方在于 httpclient 有session的概念* 在同一个httpclient 内不需要设置cookies ,会默认缓存下来* @param loginUrl* @param userInfoUrl*/
public void httpClientLogin(String loginUrl,String userInfoUrl) throws Exception{CloseableHttpClient httpclient = HttpClients.createDefault();HttpUriRequest login = RequestBuilder.post().setUri(new URI(loginUrl))// 登陆url.setHeader("Upgrade-Insecure-Requests","1").setHeader("Accept","application/json").setHeader("Content-Type","application/x-www-form-urlencoded").setHeader("X-Requested-With","XMLHttpRequest").setHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")// 设置账号信息.addParameter("name","your_account").addParameter("password","your_password").addParameter("remember","false").addParameter("ticket","").addParameter("ck","").build();// 模拟登陆CloseableHttpResponse response = httpclient.execute(login);if (response.getStatusLine().getStatusCode() == 200){// 构造访问个人中心请求HttpGet httpGet = new HttpGet(userInfoUrl);CloseableHttpResponse user_response = httpclient.execute(httpGet);HttpEntity entity = user_response.getEntity();//String body = EntityUtils.toString(entity, "utf-8");// 偷个懒,直接判断 缺心眼那叫单纯 是否存在字符串中System.out.println("缺心眼那叫单纯是否查找到?"+(body.contains("缺心眼那叫单纯")));}else {System.out.println("httpclient 模拟登录豆瓣失败了!!!!");}
}

运行这段代码,返回的结果也是 true。

有关 Java 爬虫遇到登陆问题就聊得差不多啦,来总结一下:对于爬虫遇到登陆问题有两种解决办法,一种是手动设置cookie,这种方式适用于短暂性采集或者一次性采集,成本较低。另一种方式是模拟登陆的方式,这种方式适用于长期采集的网站,因为模拟登陆的代价还是蛮高的,特别是一些变态的验证码,好处就是能够让你一劳永逸

以上就是 Java 爬虫时遇到登陆问题相关知识分享,希望对你有所帮助,下一篇是关于爬虫是遇到数据异步加载的问题。如果你对爬虫感兴趣,不妨关注一波,相互学习,相互进步

源代码:源代码

文章不足之处,望大家多多指点,共同学习,共同进步

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_754640.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站部署到Linux服务器上并添加https证书

用的是Nginx服务器 一、部署 将网站打包成war包 放到Linux的data/wwwroot/default目录 解压&#xff1a;jar -xvf novel.war 删除war包&#xff1a;rm novel.war 删除文件夹 &#xff1a;rm -rf novel 二、申请SSL证书 网站 &#xff1a;https://www.pianyissl.com/ 三、…

当网站遭遇DDOS攻击的解决方案及展望

当网站遭遇DDOS攻击的解决方案及展望一、事件发生春节长假刚过完&#xff0c;WEB就出现故障&#xff0c;下午1点吃完回来&#xff0c;立即将桌面解锁并习惯性的检查了Web服务器。通过Web服务器性能监视软件图像显示的向下滑行的红色曲线看到WEB出现问题了。根据上述的问题&…

基于WebSphere与Domino的电子商务网站构架分析

本文出自 “李晨光原创技术博客” 博客&#xff0c;谢绝转载&#xff01; 转载于:https://www.cnblogs.com/chenguang/p/3742340.html

随时查看源码的网站---http://www.sooset.com/

由于工作需要经常要在Windows平台下参阅linux源码&#xff0c;以前都用http://lxr.linux.no/来浏览源码&#xff08;如下图所示&#xff09;,最近发现sooset来浏览更方便&#xff0c;所以介绍给大家分享。导航栏用起来很方便&#xff0c;不是吗&#xff1f;呵呵更多详情请参考&…

大型网站架构之百万PV

一&#xff1a;百万PV架构概述PV(page view&#xff0c;页面浏览量)即点击量&#xff0c;通常是衡量一个网站受欢迎程度的主要指标。本案例采用四层模式实现&#xff0c;主要分为前端反向代理层、web层、数据库缓存层和数据库层。前端反向代理层采用主备模式&#xff0c;web层采…

网站及监控利器 Pandora FMS使用体验

Pandora FMS 是一个 开源的应用程序 &#xff0c;用来监测网站的各种活动,它可以收到实时的监测报告&#xff0c;并发送到你指定的邮箱&#xff0c;也可以通过e-mail&#xff0c; SMS 发送。 更多Linux下的监控软件请关注《Linux企业应用案例精解》一书本文出自 “李晨光原创技…

layui导入模板数据_大气漂亮美观的三个网站后台数据管理模板 大大提升你的开发效率...

今天整理了三个我做项目经常使用的三个网站后台模板&#xff0c;这三个模板都是开源的&#xff0c;可以下载商用&#xff0c;可基于它们开发任何网站&#xff0c;做为后台管理数据。这样能为你开发后台功能节约大量的时间。一.ok-admin 一个很赞的&#xff0c;扁平化风格的&…

Silverlight SEO(搜索引擎优化)白皮书

概要这份文档描述了一些Silverlight程序的搜索引擎优化&#xff08;SEO&#xff09;技巧。这些技巧是用来帮助开发人员使得Silverlight内容能够在搜索引擎的结果页被发现&#xff0c;并为没有激活Silverlight的用户提供合意的体验。这份文档将包括以下的章节&#xff1a;*介绍 …

21绝对优秀的网站推荐,激发创意寻找灵感的好去处

世界上总有这么一些人乐于分享&#xff0c;下面挑出21个在设计方面绝对优秀的网站&#xff0c;里面有超酷的设计&#xff0c;时尚的咨询&#xff0c;成功的经验&#xff0c;uleadesign的很多内容就来自于这些网站&#xff0c;希望大家喜欢. 1. Deviantart 2. Behance 3. Abduze…

注册地址从零开始学建站-域名篇

今天朋友几篇文章分析了改注册地址的文章. 关联文章的地址 从零开始学建站-域名篇 域名的基础知识 域名俗称网址&#xff0c;很多人对于一个网站的最初印象可能恰是从这些字符串开始的。为了给拜访者留下一个深刻的第一印象&#xff0c;域名的选择在网站建立过程中有着很大的作…

eclipse for java linux_Eclipse的安装 - Ubuntu 14.04下Java开发环境的搭建_Linux教程_Linux公社-Linux系统门户网站...

下面我们来安装Eclipse&#xff01;安装Eclipse 的前提是&#xff0c;你的JDK已经安装成功好了 开始安装。首先在合适的地方解压eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gzcd /opt/DevelopTools/ide/sudo cp/home/home/下载/eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar…

php自动识别pc和手机端并跳转,JS如何实现网站中PC端和手机端自动识别并跳转对应的代码...

1. 代码场景&#xff1a;描述&#xff1a;在项目中&#xff0c;一般我们会使用响应式布局的方式或者借助bootstrap等插件来做响应式的网站。但是根据业务的需求&#xff0c;手机端可能会在功能上精简很多&#xff0c;我们也会写两套代码&#xff0c;分别用来实现PC端和手机端的…

1月国内网站流量统计:百度稳夺冠军 腾讯季军

IDC评述网&#xff08;idcps.com&#xff09;01月30日报道&#xff1a;根据中国互联网协会-中国网站排名公布的最新数据显示&#xff0c;截至2015年01月28日&#xff0c;国内网站独立访问量排名前五的是&#xff1a;百度、360安全中心、腾讯网、搜狗、淘宝网&#xff0c;如下图…

HTML5 Web Speech API,让网站更有趣

Web API 变得越来越丰富&#xff0c;其中一个值得注意的是Web Speech API。传统的网站只能“说”&#xff0c;这个API的出现&#xff0c;让网站能“倾听”用户。这个功能已经开放了一系列的用法&#xff0c;非常棒。 在这篇文章中&#xff0c;我们将看一下这项技术和建议的用法…

【读书笔记】第三章 大型网站核心架构要素

2019独角兽企业重金招聘Python工程师标准>>> #第三章 大型网站核心架构要素 软件架构&#xff1a;有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计 软件架构需要关注的几个方面&#xff1a; 系统功能需求&#xff08;最基本的&…

求职季,你需要一点 SEO 思维

SEOer 是一群和百度上演着相爱相杀戏码的人&#xff0c;这些人擅长搞排名、引流量。乍一看&#xff0c;SEO 与找工作之间似乎并没有什么关联。但其实借鉴用户在网上搜索产品的思维方式&#xff0c;很容易让 HR 找到我们。那么我们应该如何运用 SEO 思维让工作找到自己呢?在这之…

java eclipse字体大小设置_「eclipse字体大小设置」Eclipse中调整字体的大小 - seo实验室...

eclipse字体大小设置1.点击window&#xff0c;然后选择preferences&#xff0c;进入下面的界面。在输入框中输入font&#xff0c;然后选择colors and fonts &#xff0c;再选择basic&#xff1a;2.在basic中找到text&#xff0c;然后点击edit3.这样就来到了设置界面&#xff0c…

SSL安全性检测的在线测试网站--有需要的推荐

https://www.ssllabs.com/ 下一个要解决的问题&#xff1a; CRIME: Information Leakage Attack against SSL/TLS https://community.qualys.com/blogs/securitylabs/2012/09/14/crime-information-leakage-attack-against-ssltls

两天开发的网站果然没人用,所以我决定优化一下

J3 - 西行杂文&#xff08;小夹子 # 开发&#xff09; 上周末在家封闭了两天&#xff0c;就为了解个心结做个小夹子网站出来&#xff0c;最初的功能就是单纯的把我所看过的文章、资料保存起来&#xff0c;方便以后统计、回顾。 并且我也是紧接着出了一篇相关文章来说明这件事&…

两天开发个网站,不为别的就为存点小资源

两天开发个网站&#xff0c;不为别的就为存点小资源 J3 - 西行杂文&#xff08;小夹子 # 开发&#xff09; 以下“资源”一词如特别说明&#xff0c;一律指学习资源或技术文章 从事技术类软件开发也有快两年了&#xff08;强行增加工作经验&#xff09;&#xff0c;深知持续学…