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

news/2024/5/20 21:21:22/文章来源:https://blog.csdn.net/wanghao112956/article/details/102474887

这是 Java 网络爬虫系列博文的第二篇,在上一篇 Java 网络爬虫,就是这么的简单 中,我们简单的学习了一下如何利用 Java 进行网络爬虫。在这一篇中我们将简单的聊一聊在网络爬虫时,遇到需要登录的网站,我们该怎么办?

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

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

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

手动设置 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 爬虫时遇到登陆问题相关知识分享,希望对你有所帮助,下一篇是关于爬虫是遇到数据异步加载的问题。如果你对爬虫感兴趣,不妨关注一波,相互学习,相互进步

源代码:源代码

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

最后

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

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

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

相关文章

【Python】Flask+Gunicorn搭建简单网站

1.安装Flask第三方库 pip3 install Flask 2.创建Flask应用程序 项目结构如上图所示&#xff0c;其中static用来放置静态文件&#xff0c;如js文件、css文件以及图片等&#xff0c;templates文件夹用来放置模板文件&#xff0c;即html文件。 在项目中导入Flask第三方库&#…

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

一、反向代理&#xff1a;Web服务器的“经纪人” 1.1 反向代理初印象 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给internet上请…

css3和html5网站模板

过去的几年&#xff0c;网页设计和制作人员就已开始关注和使用 HTML5 了&#xff0c;如今 HTML5 得到了更加广泛的应用&#xff0c;国外已有很多基于 HTML5 制作的网站。所以&#xff0c;今天这篇文章给大家带来的是35款基于 HTML5 和 CSS3 的非常精致的网站模板&#xff0c;大…

分享88个ASP.NET企业网站源码,总有一款适合您

分享88个ASP.NET企业网站源码&#xff0c;总有一款适合您 88个ASP.NET企业网站源码下载链接&#xff1a;https://pan.baidu.com/s/1AXv0-dmV-bV-MQTyX9OXRg?pwdzcwa 提取码&#xff1a;zcwa Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 新翔绩效考核系统基…

分享69个ASP.NET企业网站源码,总有一款适合您

分享69个ASP.NET企业网站源码&#xff0c;总有一款适合您 69个ASP.NET企业网站源码下载链接&#xff1a;https://pan.baidu.com/s/1lOmnWD83XkU29_Ix-ldVYQ?pwds9q9 提取码&#xff1a;s9q9 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 AutoWeb建站王.NET企…

Google网站管理员工具的新功能

近日&#xff0c;Google网站管理员工具(原Google Sitemap)进一步扩展了其功能&#xff0c;可以更有效地帮助用户分析网站中可能存在的问题以及如何更有效地进行对网站的优化。详细信息请参见Google Webmaster Central官方Blog中的说明。其中较引人注意的便是如今在Google网站管…

linux网站搭建实例

我们知道windows网站搭建一般是&#xff1a;IISAspSqlserver&#xff0c;而linux网站搭建是&#xff1a;ApachephpMysql。两者之间个有千秋&#xff0c;但是为什么我们许多的门户网站搭建都选择linux—apachephpmysql呢&#xff1f;当然是其的安全性了&#xff0c;Apache 是世界…

一个可以动态创建响应动画GIF的网站,AjaxLoad

呵呵&#xff0c;使用Ajax做Web开发的必备品看看样式&#xff1a;呵呵&#xff0c;还有许多样式&#xff0c;如果你想要&#xff0c;可以到这个网站自己生成喔http://www.ajaxload.info/

二十行代码!实现网站的验证码自动识别

一. 自己去chaojiying官网注册一个账号,购买相关的产品. 爬虫时候,自动识别需要登录的验证码,并实现自动登录,第一步使用超级鹰识别出网站的验证码 #!/usr/bin/env python # coding:utf-8import requests from hashlib import md5class Chaojiying_Client(object):def __init__…

SEO第二课:索引

上周我们学习了搜索引擎工作原理中信息收集的部分——蜘蛛和收录&#xff0c;了解到搜索引擎蜘蛛对网页的抓取方式以及网站目录结构、链接结构将决定蜘蛛采用深度优先或广度优先进行爬取。那么搜索引擎是如何存储蜘蛛爬取到的网页和链接信息&#xff1f;如何根据用户给定的关键…

EntLib.com 网站征集中文名称,希望各位热心的朋友踊跃发言

EntLib.com 网站征集中文名称&#xff0c;希望各位热心的朋友踊跃发言EntLib.com Team 专注于开源.Net 系统&#xff0c;如开源ASP.NET论坛、开源ASP.NET博客、开源ASP.NET电子商务平台&#xff08;前台购物系统和后台业务处理系统&#xff09;&#xff0c;以及分享、交流Micro…

启明星Portal企业内部网站V4.3版 附演示地址 http://demo.dotnetcms.org

下载地址&#xff1a;http://www.dotnetcms.org/download/portal/PortalV4.3.0.0.rar 启明星Portal系统是一款基于微软ASP.NET平台开发的&#xff0c;集成内容发布、文章、产品、图片、招聘、留言、自定义模型、采集等功能于一体的企业网站管理系统。启明星Portal是构建企业内网…

推荐两个网页设计在线配色网站

对于网页设计师而言&#xff0c;每个网站的设计都需要一套最适合它的配色方案&#xff0c;配色方案的选择关系到整个网站的成功与失败。下面我向大家推荐两个国外在线配色方案网站&#xff0c;也许会给你的设计工作带来很大的帮助。ColorbeColorbe是我在很久之前在网上面的一个…

SEO三原素,看图你懂的!

SEO三原素&#xff08;图示&#xff09; 结构、内容、链接都是SEO的必要因素&#xff0c;通过不同权重的匹配&#xff0c;衍生出其他优化要素。 图中&#xff0c;将SEO整个关系链清晰地展示给我们&#xff0c;并用线条画出了其在网站结构、内容、链接要素中所处的位置。把与SEO…

10个优秀的网站分析工具

2019独角兽企业重金招聘Python工程师标准>>> 1) Piwik Piwik是一套基于PhpMySQL技术构建的开源网站访问统计系统&#xff0c;前身是 phpMyVisites。Piwik可以给你详细的统计信息&#xff0c;比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等&#xff0c;并且…

做在线电子商务交易的网站,该如何选择证书服务?

2019独角兽企业重金招聘Python工程师标准>>> GlobalSign (http://cn.globalsign.com/) 的产品有&#xff1a;DV&#xff1a;域名型&#xff0c;OV&#xff1a;企业型&#xff0c;EV&#xff1a;增强型SSL证书&#xff0c;他们区别在于&#xff1a; 一&#xff1a;审…

使用Google WebP图片格式帮助控制网站页面大小

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2013-3-16 来源&#xff1a;GBin1.com 不管你相信或者不相信&#xff0c;随着互联网的快速发展网页也在持续不断的变大。 使 网页迅速膨胀的罪魁祸首不是大量使用的JavaScript库&#xff0c;CSS和…

我记录网站综合系统 -- 技术原理解析[8:ActionChecker流程]

源代码位置&#xff1a;\Web\Mvc\Processors&#xff1a;ActionMethodChecker.csForbiddenActionChecker.csLoginActionChecker.csConfig -> wojilu.Web.Mvc.CoreHandler.ProcessRequest - > wojilu.Web.Mvc.CoreHandler.ProcessRequest: ProcessContext.Begin ->Ro…

一个讲的很好的android SDK 入门网站

为什么80%的码农都做不了架构师&#xff1f;>>> http://mobile.tutsplus.com/category/tutorials/android/ 转载于:https://my.oschina.net/sjr/blog/125661