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

源代码:源代码

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

最后

打个小广告,欢迎扫码关注微信公众号:「平头哥的技术博文」,一起进步吧。

iframe的src怎么携带参数_Java 爬虫遇到需要登录的网站,该怎么办?相关推荐

  1. iframe的src怎么携带参数_三种传递gRPC动态参数方式的使用体验

    gRPC是一个远程调用框架,使用Protobuf做为信息的载体来完成客户端和服务端的数据传输.关于怎么定义Protobuf消息.搭建gRPC服务在之前的系列文章中都有提及,今天来说一下在使用gRPC和 ...

  2. java爬虫怎么确定url连接_Java爬虫之抓取一个网站上的全部链接

    前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫,测 ...

  3. python爬虫登录12306失败_Python网络爬虫(selenium模拟登录12306网站)

    一.通过selenium自动登录12306官网 1.1 超级鹰打码平台API,创建chaojiyin.py文件 #!/usr/bin/env python#coding:utf-8 importreq ...

  4. C#网络爬虫(获取需要登录的网站数据)

    鉴于业务需求,我们系统需要从某个网站爬取数据,而这个网站是需要登录的,所以请求需登录的网站数据的时候需要带上cookie,百度了一堆很多都是从请求的数据中取得cookie,我在想我都能取得数据了,还要 ...

  5. js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  6. java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  7. JAVA异步爬虫_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  8. iframe中src参数过长问题解决

    iframe中src参数过长问题解决 参考文章: (1)iframe中src参数过长问题解决 (2)https://www.cnblogs.com/pengfei25/articles/7473503 ...

  9. 解决父类加载iframe,src参数过大导致加载失败

    原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...

最新文章

  1. 美多商城之商品(准备商品数据 )、Dockers容器和FastDFS存储
  2. OpenGL(glut)模拟太阳系:太阳,地球,月球,火星
  3. 文化致胜的时代 协同OA可以这样助力企业文化建设
  4. Spark - 大数据Big Data处理框架
  5. 学习笔记(九)——JSON 和 AJAX
  6. SCI科技论文写作技巧-核心价值
  7. 前谷歌技术主管亲述:程序员请避开这几大雷区
  8. 使用redis做缓存,遇到Could not return the resource to the pool异常怎么办呐!
  9. 微信小程序环境下将文件上传到 OSS
  10. UITableView自动计算图片的高度 SDWebImage
  11. L3-005. 垃圾箱分布-PAT团体程序设计天梯赛GPLT(Dijkstra)
  12. Excel 公式 lenB无效 解决方案
  13. 14.docker volumn
  14. pycharm添加python注释头_pycharm使用教程——py文件自动添加文件头注释
  15. python批量写入数据库_python实现数据库批量数据插入.
  16. postgresql 修改表字段的长度
  17. html中标签img大小自适应
  18. ArcGIS中ObjectID,FID和OID字段区别
  19. 货币制度 - 异想天开
  20. securitytube视频列表

热门文章

  1. 生成Rss聚合页xml内容信息
  2. 我来分析委托的协变与逆变
  3. Catch a cold, will be back later
  4. 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?...
  5. lastpass密码管理工具使用教程
  6. SQL中varchar和nvarchar有什么区别?
  7. redis 配置文件 append only file(aof)部分---数据持久化
  8. Mac OS X:在标题栏上显示目录完整路径
  9. DF学数据结构系列——B树(B-树和B+树)介绍
  10. 协议开发 中移动CMPP2.0协议API(三)