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

news/2024/5/19 15:39:44/文章来源:https://blog.csdn.net/weixin_36406678/article/details/114452934

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

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

手动设置 cookie

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

图中的这个 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 {

// 个人中心url

String user_info_url = "https://www.douban.com/people/150968577/";

new CrawleLogin().setCookies(user_info_url);

运行 main 得到结果如下:

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

模拟登陆方式

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

从 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 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 {

// 个人中心url

String 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 方法,得到如下结果:

AAffA0nNPuCLAAAAAElFTkSuQmCC

模拟登陆的方式也成功的获取到了网名缺心眼那叫单纯,虽然这已经是最简单的模拟登陆啦,从代码量上就可以看出它比设置 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 爬虫时遇到登陆问题相关知识分享,希望对你有所帮助,下一篇是关于爬虫是遇到数据异步加载的问题。如果你对爬虫感兴趣,不妨关注一波,相互学习,相互进步

源代码:源代码

平头哥的技术博文(id:pingtouge_java)

作者:平头哥,学会伺机而动,实现弯道超车

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

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

相关文章

php行业八卦,Phpwind肖睿哲:与网站主合作信任最重要

(图为&#xff1a;Phpwind副总裁肖睿哲)【TechWeb消息】12月4日下午消息&#xff0c;Phpwind副总裁肖睿哲在“2010年中国地方与行业网站高峰论坛”上接受TechWeb专访时表示&#xff0c;与新浪微博合作产生利益之后&#xff0c;网站主将会与新浪微博七三分成&#xff0c;“Phpwi…

java请求爬取https网站报错javax.net.ssl.SSLHandshakeException的解决办法

前言 在爬取https网站的时候&#xff0c;今天遇到了一个之前没有见过的异常javax.net.ssl.SSLHandshakeException&#xff0c;具体细节请看如图 2020-06-01 23:18:17.032 DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request javax.ne…

不同网站不同网卡_不同时代网站设计制作的技巧

对于大多数网页设计师来说&#xff0c;基于特定的目标受众来计划一个网站设计项目是显而易见的。它可能是为那些喜欢苏打水或购买电子游戏或对运动鞋有亲和力的人。但是另一个需要考虑的问题经常被忽略——为不同的时代的用户设计。年龄会影响用户如何使用网站、应用程序和移动…

win7网站服务器错误怎么解决方法,win7系统网页提示network error怎么办|win7 network error的解决方法...

‍‍有很多win7旗舰版用户在访问网页的时候出现无法访问的情况&#xff0c;并提示network error&#xff0c;我们遇到在win7系统网页提示network error怎么办呢&#xff1f;会出现network error很有可能是网络参数发现错误或接触DNS服务器发生错误导致二级网页打不开&#xff0…

做网站用UTF-8编码还是GB2312编码?

经常我们打开外国网站的时候出现乱码&#xff0c;又或者打开很多非英语的外国网站的时候&#xff0c;显示的都是口口口口口的字符&#xff0c; WordPress程序是用的UTF-8&#xff0c;很多cms用的是GB2312。 ● 为什么有这么多编码&#xff1f; ● UTF-8和GB2312有什么区别&…

MOSS 2007应用日记(3)——如何创建/删除部门网站(子网站)

在顶级网站中&#xff0c;我们可以为各个部门创建自己的网站1创建部门网站&#xff08;子网站&#xff09;登录顶级网站&#xff0c;点击页面右上角的“网站操作”&#xff0c;选择“创建网站”输入网站的标题和说明&#xff0c;这里创建一个“行政部”网站在“网站网址”中输入…

用linux部署一个网站,Linux网站部署——从零到一部署一个本身的电商网站

上一篇关于部署论坛的网站已经发出&#xff0c;此次咱们来部署一下电商网站&#xff0c;前期的准备工做请参考上篇文章&#xff1a;https://editor.csdn.net/md/?articleId114901490php我在这里直接借用了一个云服务器。若是仍是本身服务器的同窗能够直接使用咱们的第一条命令…

服务器安装网站流程图,服务器操作系统的安装流程图

服务器操作系统的安装流程图 内容精选换一换外部镜像文件在从原平台导出前&#xff0c;没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作&#xff0c;推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driv…

证书 手机打不开页面_教师资格证报名入口网站打不开怎么办|教师资格证报名浏览器是哪个...

为了帮助考生解决“教师资格证报名入口网站打不开怎么办|教师资格证报名浏览器是哪个”相关的问题&#xff0c;中公教师网通过相关资料这些问题进行了整理&#xff0c;具体解决办法如下&#xff1a;相关推荐>>>2021上半年教师资格证报名入口|报名时间-中小学教师资格考…

Flash与组件:国外收费组件网站

http://www.flashcomponents.net/index.html 今天无意中光顾了这个国外flash组件网站&#xff0c;虽然基本上上都是收费但是可给我们提供一些灵感&#xff0c;同时也让我们扩展视野是个不错的平台。国内也是非常少见&#xff0c;有这样的情况。

域名怎么进行html校验,百度站长平台如何进行网站验证及常见问题

原标题&#xff1a;百度站长平台如何进行网站验证及常见问题为什么我们把网站验证到百度搜索资源平台百度搜索资源平台推荐站长添加主站(您网站的链接也许会使用www 和非 www 两种网址&#xff0c;建议添加用户能够真实访问到的网址)&#xff0c;添加并验证后&#xff0c;可证明…

网页中直接调用计算机程序,深入探讨 网站想要使用你计算机上的程序打开Web内容...

深入探讨 网站想要使用你计算机上的程序打开Web内容gOxiA 因为工作需要最近在做与桌面虚拟化相关的技术内容&#xff0c;期间就遇到了“网站想要使用你计算机上的程序打开 Web 内容”的问题。具体是在用户安装 VDA 客户端后&#xff0c;通过 IE 访问 VDI 门户时会弹出这个提示&…

怎样查看网站服务器时间,如何查看docker容器的时间_网站服务器运行维护

如何把宿主机的文件拷贝到docker中_网站服务器运行维护把宿主机的文件拷贝到docker中的方法&#xff1a;在宿主机里执行“docker cp要拷贝的文件路径容器名&#xff1a;要拷贝到容器里面对应的路径”命令即可。查看docker容器时间的方法&#xff1a;进入到容器里执行date命令即…

python之scrapy实战篇(爬取电影网站的相关信息)

缘由&#xff1a; 由于我是一个比较喜欢看电影的人&#xff0c;但是又是个孩子&#xff0c;所以技术改变生活&#xff0c;虽然说直接打开浏览器下载就好了&#xff0c;但是我懒&#xff0c;所以借此机会用Scrapy框架来简单爬取一个电影网站 需要获取的信息&#xff1a; --电…

40个漂亮的HTML5供电的网站,为你的灵感

HTML4&#xff0c;执政超过10年后&#xff0c;现在正在取代HTML5&#xff0c;它具有更先进的多媒体融合和动画功能。由于向后兼容的&#xff0c;它可以运行在几乎所有的浏览器包括移动平台&#xff0c;提供更快的加载速度&#xff0c;更流畅的第三方应用程序的连接。许多开发人…

MEC Magento系列采用Magento建站技术——全新的电子商务建站革命技术

2019独角兽企业重金招聘Python工程师标准>>> MEC Magento系列采用全球最先进的Magento建站技术&#xff0c;构建超低价格却极高优越性能的外贸网店系统&#xff0c;具有几近无限的二次开发和系统扩展可能性。 Magento建站技术框架受到全球众多500强企业和顶级知名品…

帮你早点下班~基于飞书API实现next.js网站内容自动生成实践

前言 最近在公司里得到了一项任务&#xff0c;人事给了一个 飞书的职位表格 &#xff0c;要求将里面的信息更新到官网上面去。其中涉及了已有岗位的信息更新&#xff0c;删除部分岗位和添加部分岗位。这种工作虽然简单&#xff0c;但是很琐碎&#xff0c;很麻烦。 三十个岗位…

【年度盛宴】2012年排名前20位的 CSS 网站作品

2012年涌现出众多独特的&#xff0c;令人印象深刻的 CSS 网站作品&#xff0c;要从中挑选出年度应用 CSS 的最佳网站列表一个严峻的挑战&#xff0c;因为 CSS 涵盖了媒体查询&#xff08;CSS3 Media Queries&#xff09;、CSS 动画和3D转换等众多特性。我根据过去 CSS 典型的应…

要前往的网站包含恶意软件!

2019独角兽企业重金招聘Python工程师标准>>> 今天看公司网站&#xff0c;有的栏目出现恶意软件信息&#xff0c; 恶意软件详细信息 网址&#xff1a;http://www.XXXX/2009/1008/309.html 上次检查时间&#xff1a;2013年1月2日 Google 上次测试此网页时&#xff0…

根据注册时间分析网站注册人数

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 查询语句 select FROM_UNIXTIME(regtime, %Y%m) as month, count(*) as cnt from xd_member group by month order by month asc 2. 查询结果 3. 参考资料 Mysql : Date and Time Functions http://dev.mysql.co…