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

news/2024/5/17 15:57:36/文章来源:https://blog.csdn.net/u4110122855/article/details/106825276

 

这是 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 {

    // 个人中心url

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

    // 个人中心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 方法,得到如下结果:

模拟登陆的方式也成功的获取到了网名缺心眼那叫单纯,虽然这已经是最简单的模拟登陆啦,从代码量上就可以看出它比设置 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_855472.aspx

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

相关文章

(10)基于Python模拟网站的登录

最近利用工作之余&#xff0c;把之前研究的东西又翻看了一遍&#xff0c;发现其中一个数据表格的导出&#xff0c;并没有对网站的登录进行模拟。本着打破砂锅问到底的精神&#xff0c;再一次打开该网站&#xff0c;研究了该网站的登录是怎么一回事的。 首先&#xff0c;打开抓包…

基于struts1.2的网站源码组织结构

结合自己弄的一个小项目,总结一下在MyEclipse下&#xff0c;使用Strut1.2框架开发网站的源码组织结构 &#xff08;stuts1.2的架构基本上是这样的了~&#xff09; 下图左边是源码组织结构,右边为相应的说明

数据库有用网站

分享下常用的数据库网站&#xff0c;希望对大家有用 数据库SQL基础知识&#xff1a;http://www.w3school.com.cn/sql/index.asp ChinaUnix: http://www.chinaunix.net/ itpub网站&#xff1a; http://www.itpub.net/ MySQL中文社区&#xff1a;http://www.mysqlpub.com/fo…

个人创业楷模:一个人,一个网站,5.75亿美元卖掉

个人创业楷模&#xff1a;一个人&#xff0c;一个网站&#xff0c;5.75亿美元卖掉&#xff08;转&#xff09; 一个人&#xff0c;24岁时写了一个网站&#xff0c;每天只工作2小时&#xff0c;他还嫌工作量太大。他每天从谷歌广告赚好几万美元&#xff0c;不用合伙人&#xff…

Apache网站服务器

Apache网站服务基础 Apache简介 Apache HTTP Server 是开源软件项目的杰出代表&#xff0c;基于标准的HTPP网络协议提供网页浏览服务&#xff0c;在Web服务器领域中长期保持着超过半数的份额。Apache服务器可以运行在Linux、UNIX、Windows等多种操作系统平台中。 Apache的主…

网站架构常识

1、DNS域名解析&#xff08;步骤&#xff09; 2、网站架构演变过程 &#xff08;1&#xff09;传统架构 传统项目分为三层架构&#xff0c;将业务逻辑层、数据库访问层、控制层放入在一个项目中 使用SSH或者SSM技术。 优点:适合于个人或者小团队开发&#xff0c;不适合大团队…

不修改代码就能优化ASP.NET网站性能的一些方法

阅读目录 开始配置OutputCache启用内容过期解决资源文件升级问题启用压缩删除无用的HttpModule其它优化选项本文将介绍一些方法用于优化ASP.NET网站性能&#xff0c;这些方法都是不需要修改程序代码的。它们主要分为二个方面&#xff1a;1. 利用ASP.NET自身的扩展性进行优化。2…

IIS日志-网站运维的好帮手

阅读目录 开始IIS日志包含了哪些信息IIS日志的配置如何分析IIS日志推荐的IIS日志分析方法IIS日志中的异常记录再谈 scwin32status64寻找性能问题寻找可改进的目标程序架构对IIS日志分析过程的影响对于一个需要长期维护的网站来说&#xff0c;如何让网站长久稳定运行是件很有意义…

【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9)的解决方法

【写在前面】 在用requests库对自己的CSDN个人博客&#xff08;https://blog.csdn.net/yuzipeng&#xff09;进行爬取时&#xff0c;发现乱码报错&#xff08;\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9&#xff09;&#xff0c;如下图所示&#xff1a; 网上 查找了一些方法&#xff0c…

【Python成长之路】破解Boss直聘网站滑块验证

哈喽大家好&#xff0c;我是鹏哥。 今天要记录的内容是 —— 破解Boss直聘网站的滑块验证。 …… 上 课 铃…… TuesdayBurak Yeter;Danelle Sandoval - Tuesday 1 写在前面 最近领导安排我投入公司招聘工作&#xff0c;然后自然就需要不停地在boss直聘网上进行人才搜索。搞了…

【Python成长之路】基于Flask开发网站--利用复选框进行批量操作

哈喽大家好&#xff0c;我是鹏哥。 今天我想写的内容是 —— 基于Flask实现网页表格的批量删除。 ~~~上课铃~~~ LiberatorsEpic Score - Vengeance - ES033 1 写在前面 由于近期有同事在工作中向我求助网页可视化怎么做&#xff0c;对于从来没有学过html/vue/javascript等框架开…

【Python成长之路】基于Flask开发网站 -- 基于重定向实现搜索功能

哈喽大家好&#xff0c;我是鹏哥。 今天继续上周的内容&#xff0c;仍然讲基于Flask开发网站&#xff0c;不过这次的控件是 ——基于重定向实现搜索功能。 ~~~上课铃~~~ Silver Scrapes(As Featured In the ESPN "This Is College GameDay" Spot)Danny McCarthy - Si…

【Python成长之路】从 零做网站开发 -- 下拉选择项的实现

哈喽大家好&#xff0c;我是鹏哥。 今天继续之前的html组件开发话题是 —— 下拉选择项。 ~~~上课铃~~~ 卡农变奏曲K.Williams - 终极钢琴测试王 1 写在前面 上次的搜索功能&#xff0c;有粉丝提到&#xff0c;能不能设置成可选的搜索条件。答案自然是可以的&#xff0c;所以我…

手把手教你用 Docker 部署网站[Docker 系列-8]

大家好&#xff0c;我是本周的值班编辑 江南一点雨 &#xff0c;本周将由我为大家排版并送出技术干货&#xff0c;大家可以在公众号后台回复“java”&#xff0c;获得作者 Java 知识体系/面试必看资料。在实际的开发环境或者生产环境&#xff0c;容器往往都不是独立运行的&…

推荐几个不错第 Java 学习网站

这是Java极客技术的第313篇原创文章粉粉昨天晚上做梦&#xff0c;梦见自己想好好学习一下 Java&#xff0c;因为平常总是 CRUD 导致自己根本没有时间学习&#xff0c;所以第二天粉粉怀着激动的心情不到5点就起床整理&#xff0c;从而给大家推荐几个不错的网站。LearnJava 在线这…

阿粉带你从零搭建一个属于自己的个人网站

每天早上七点三十分&#xff0c;准时推送干货很多小伙伴私信我&#xff0c;问我怎么弄一个个人博客系统&#xff0c;之前其实也聊过&#xff0c;不过没关系&#xff0c;今天我们再来详细的说一说。对于已经上线的项目&#xff0c;我们知道后期的迭代主要集中在线上发布这个环节…

面试官:假如说我们现在要做一个千万级用户量网站,你怎么设计高并发架构?...

每天早上七点三十&#xff0c;准时推送干货之前的时候&#xff0c;阿粉一直在看同事面试&#xff0c;但是呢&#xff0c;阿粉并没有自己去面试&#xff0c;而无意间打开Boss的时候&#xff0c;发现一家公司私聊了我&#xff0c;我回复了一下之后&#xff0c;竟然说我可以去面试…

引入两个依赖之后,阿粉一周内就完成了网站的登录改造|实战开发

每天早上七点三十&#xff0c;准时推送干货上次阿粉在文章中介绍了四种分布式一致性 Session 的实现方式&#xff0c;在这四种中最常用的就是后端集中存储方案&#xff0c;这样即使 web 应用重启或者扩容&#xff0c;Session 都没有丢失的风险。今天我们就使用这种方式对 Sessi…

太全了!学Java项目,上这个网站就够了

你有多久没好好学习一个开源项目了&#xff1f;你是否经常为找不到好的开源项目而烦恼&#xff1f;你是否为不知道怎么入手去看一个开源项目&#xff1f;你是否想看别人的项目学习笔记&#xff1f;你是否想跟着别人的项目搭建过程一步一步跟着做项目&#xff1f;今天给大家介绍…

修补破窗和分类网站

我一直相信&#xff0c;Craig做的众多的正确的事情中间&#xff0c;十年如一日的删除垃圾广告是Craigslist成功的重要最重要的因素。 这就牵涉到一个叫做破窗理论的概念。它讲的就是仓库如果有一扇窗子破了&#xff0c;不及时修补&#xff0c;很快所有的窗户都会被打破。甚至这…