之前,为了从半次元上下载coser小姐姐的照片,想写个爬虫保存网页上的图片链接,就直接用了Jsoup来读取半次元的网页。
这里说一下,对于想写Java爬虫的小伙伴们来说,Jsoup算是很好用的html解析器,有兴趣深入研究的可以尝试下。
官网:https://jsoup.org/
但是,保存下来的html却和浏览器F12审查元素显示的不一样,这才发觉半次元应该是用了Ajax动态加载网页,而分析异步js又很麻烦(嗯就是懒)。。。
不得已,换方法。
PhantomJS是一个可编写脚本的无头网页浏览器。它可以运行在Windows,macOS,Linux和FreeBSD上。
官网:http://phantomjs.org/
所以这里我们的思路就是用PhantomJs当做浏览器访问网站,当然也包括浏览器进行的各种Ajax请求,这样就能在Java中调用并得到一个完整的html,和你在用浏览器访问的效果一样。
system = require('system')
address = system.args[1];
path = system.args[2]
var page = require('webpage').create();
var url = address; //访问网址
var savePath = path; //截图保存路径,不写默认保存的调用phantomjs的目录
page.open(url, function (status) {
console.log("Status: " + status);
if (status === 'success') {
window.setTimeout(function () { //设置等待延迟,保证phantom能完整加载出页面
page.render(savePath + "webscreenshot.png"); //网页截图
console.log(page.content); //网页html文本
phantom.exit();
}, 5000);
} else {
console.log('Failed to post!');
phantom.exit();
}
});
/**
* 获取ajax页面内容
*/
public String getAjaxCotnent(String url, String path) {
String exec = phantom + " " + codejs + " " + url + " " + path; //执行命令,替换成你自己的文件路径
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(exec);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while((tmp =br.readLine()) != null){
sbf.append(tmp);
}
System.out.println(sbf.toString());
return sbf.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
以上,我们就能在Java中调用PhantomJs脚本,得到浏览器进行Ajax请求后的html了
本来以为大功告成了,却又发现,有些小姐姐的作品限制了访问权限。
比如登录或者关注才可查看:
也 许 可 以 用 P h a n t o m J s 模 拟 浏 览 器 进 行 写 操 作 , 但 那 样 无 疑 涉 及 到 大 量 j s 脚 本 编 写 , 我 又 不 是 专 门 学 这 个 的 。 。 。 \color{gray}{也许可以用PhantomJs模拟浏览器进行写操作,但那样无疑涉及到大量js脚本编写,我又不是专门学这个的。。。} 也许可以用PhantomJs模拟浏览器进行写操作,但那样无疑涉及到大量js脚本编写,我又不是专门学这个的。。。
所以呢,现在的网站都采用cookie保存用户信息,方便自动登录等操作。如果你要在登录状态下访问网站,只需要给phantom加上cookie就好了。
system = require('system')
address = system.args[1];
path = system.args[2]
var page = require('webpage').create();
var url = address;
var savePath = path;
//添加cookie,添加成功返回true,否则返回false
var flag = phantom.addCookie({
'name' : 'sessionid', //cookie的name
'value' : '换成你自己的value', //cookie的value
'domain' : '.bcy.net',
'path' : '/',
'httponly' : false,
'secure' : false,
'expires' : 'Fri, 01 Jan 2038 00:00:00 GMT'
});
console.log(flag);
if(flag) {
page.open(url, function (status) {
console.log("Status: " + status);
if (status === 'success') {
window.setTimeout(function () {
page.render(savePath + "webscreenshot.png");
console.log(page.content);
phantom.exit();
}, 5000);
} else {
console.log('Failed to post!');
phantom.exit();
}
});
} else {
console.log('cookies error')
}
这样,我们就能携带cookie以登录状态访问网站了
源码地址:https://github.com/JohnnyJYWu/bcy-webcrawler-Java/tree/master/phantomjs
(包含phantomjs.exe)
这篇文章是为了下一篇文章做的准备。
项目 | Java+PhantomJs爬虫实战——半次元 下载高清原图
第一次写博,有不足之处欢迎各位大佬批评指正。
我的GitHub:https://github.com/JohnnyJYWu