本文作者:开源技术之家

Java使用HttpClient抓取新浪邮箱

开源技术之家 4个月前 ( 09-27 ) 263 百度已收录
Java使用HttpClient抓取新浪邮箱摘要: 前一段时间的无聊就简单实现了一个新浪邮箱的邮件爬取功能,主要是处理一些无法通过邮件协议读取邮件的问题本文以新浪邮件为例,其他邮箱实现思路大致相同应用场景当你有一堆通过某些途径得到了...


前一段时间的无聊就简单实现了一个新浪邮箱的邮件爬取功能,主要是处理一些无法通过邮件协议读取邮件的问题


本文以新浪邮件为例,其他邮箱实现思路大致相同


应用场景


当你有一堆通过某些途径得到了一些邮件的用户名和密码,而这个查看邮件又不需要人工去操作,那么第一想到的程序实现了,当然这就不排除有些情况没有办法通过邮件协议 POP3 读取邮件的。于是就想到了通过爬虫来完成这样的事情


思路


通过使用HttpClient发送Http请求来完成对浏览器请求的模拟

使用Jsoup的来完成网页的解析功能

想到这里于是就开干起来了。这里就完整的呈现当时处理的思路


对请求的分析


这里使用了firefox比较牛B的一个插件firebug


打开新浪邮箱的首页

Java使用HttpClient抓取新浪邮箱 第1张其他的请求这里被清除了, 我们需要关心的是,当点击登陆按钮的时候浏览器都做了什么,

还是简单的输入用户名和密码就开始登陆了。

Java使用HttpClient抓取新浪邮箱 第2张

呵呵呵,第一眼一看我擦这个没有输入的用户和密码呢,这也藏的太深了吧。一大堆奇奇怪怪的参数,难道这就行不通了。


不过再认真一看,也就sp,su,nonce,rsakv 这几个参数有一些怪怪的。

似乎使用 HttpClient + Jsoup 这条路就走不通了。


不过想了一下,这些事情都是浏览器完成的,那么按道理是可能通过程序的方式来完成的(无非也就是使用 javascritp 做一些对密码进行加密撒的吧)


如果 JavaScript 的代码不是那么复杂就自己改写为Java代码

过于复杂,就是 Java8 的 nashorn(JavaScript的一个运行环境) 来做吧

查看手机端的请求方式是否会简单一些(实际是一样的登陆流程)

那么就需要早是那段 JavaScript 代码在做这些事情,那么就需要看都发了那些 Js 到浏览器了

Java使用HttpClient抓取新浪邮箱 第3张
看名字就可以知道了 ssilogin.js 和 login.js 嫌疑比较的大,后面通过 javascript 断点调试的方式发现是使用了 ssilogin.js

由于这个文件的内容比较的多于是选择上面的后者(Java8 解释 JavaScript的方式来完成)


中途有想过使用第三方的库 selenium 来做,不过考虑到依赖浏览器(对于运行环境都有一些要求,于是就这样被 Pass掉了)


整理完当时的思路,就来看看代码使怎样实现这个看似有些复杂的事情吧。


Java使用HttpClient抓取新浪邮箱 第4张
Java使用HttpClient抓取新浪邮箱 第5张
Java使用HttpClient抓取新浪邮箱 第6张

nashorn 对 javascript的支持是有限的,比如document,windows.location,判断浏览器,timeout 这些都是无法完成,如果出现类似的请求,先的删掉对应的 js 代码


看上去也还是挺精简的,整个代码做了那些事情。


使用 Java8 nashorn 加载新浪的 osslogin.js

调用自己的计算 sp(sinapassword) 代码

组装其他请求参数,发送 post 请求

得到需要访问的几个 URL 列表(这里有一个 cookie 需要请求来生成)

查看获取邮件的请求,模拟发起请求得到对应的 Json 数据


完整代码移步到


http://git.oschina.net/94fzb/fetch-sina-mail





本文标题:Java使用HttpClient抓取新浪邮箱
本文链接:http://kyjszj.com/htzq/399.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
文章版权及转载声明

作者:开源技术之家本文地址:http://kyjszj.com/htzq/399.html发布于 4个月前 ( 09-27 )
文章转载或复制请以超链接形式并注明出处开源技术之家

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏