1. 前言
笔者今年9月份就要大四了,迟早要经历面试什么的,那么从现在起就要做好充足的准备,无意间发现了一些比较好的面试题博文,于是便想把里面的内容爬下来,以后阅读起来也很方便,顺便还能实践一下Jsoup网页爬虫。
想法有了,数据资源有了,那么一个用于个人学习的“程序猿面试指南”App就诞生了。
有些人可能说这种爬博文没啥技术含量,其实道理理解了其他都好说。
这里再推荐一篇文章《Android实战 Jsoup实现网络爬虫,糗事百科项目的起步》供参考。
2. 关于Jsoup
简介:
“jsoup是一个Java库来处理实际的HTML。它提供了一个非常方便的API来提取和操纵数据,使用最好的DOM,CSS和jQuery-like方法”。说白了就是解析HTML用的。
AndroidStudio配置:
第一是在gradle中添加依赖:
compile 'org.jsoup:jsoup:1.10.2'
第二不要忘记添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
基本用法:
(1)获取HTML
GET方法:
Document doc = Jsoup.connect(URL).get();
POST方法:
Document doc = Jsoup.connect(URL)
.data("key", "value") //设置请求体的键值对参数
.userAgent("Mozilla") //设置用户代理(属于请求头,可判断来自PC端还是移动端)
.cookie("key", "value") //设置cookie
.timeout(6000) //设置请求超时
.post();
(2)获取页面元素
获取方式,getXXXByXXX():
Elements elements = doc.getElementsByClass("contents");
或者select():
Elements elements = doc.select("h3").select("strong").select("a.className");
Element el = elements.get(POSITION);
其他更多:
几种对象:
- Document:对应Html
- Elements:对应一些标签的集合
- Element:对应某个标签
获取内容的方法区分:
- toString():获得的是含有标签的Html内容
- text():获得的是标签对应的文本内容
- html():获得的是我们在浏览器中看到的内容
3. 实践一下
知道了基本用法,那么就开始我们的“程序猿面试指南”App小试牛刀吧。
这里用到的资源是:
①《【剑指Offer学习】【所有面试题汇总】》http://blog.youkuaiyun.com/derrantcm/article/details/46887821,
②《BAT(百度,阿里,腾迅)面试题》http://blog.youkuaiyun.com/derrantcm/article/details/46658823#comments。
非常感谢博主的文章,这里爬取博主大大的文章仅作为学习使用,谢谢!
首先,我们要分析一下页面元素:
(PS:爬数据的劣势是,如果今后博主把文章修改,那么可能导致我们解析页面出错)
以网址①为例,进入页面按F12进入查看元素或源代码:
我们看到文章的所有内容都被放在了一个 class=”markdown_views” 的div中,
其次我们想要的子标题和其超链接都是以如下形式存放的,
“h3”标签中嵌套了“strong”,然后又嵌套了“a”标签,我们的目标是得到“a”标签中href参数的值和title参数的值。
元素的嵌套已经大致清楚了,不得不说上面那一条是无效数据,因为它的值都是空的,在接下来编写中我们还要记得筛选有效数据。
主要的代码如下:
/* 面试题实体类 */
public class Question implements Serializable {
private String title; // 题目
private String answer; // 答案或者答案的超链接
private boolean isShowed; // 是否显示了答案
......
}
/* 解析逻辑 */
new Thread() {
@Override
public void run() {
super.run();
try {
Document doc = Jsoup.connect("http://blog.youkuaiyun.com/derrantcm/article/details/46887821").get();
Elements elements = doc.getElementsByClass("markdown_views");
Elements links = elements.select("h3").select("strong").select("a");
for (int i = 0; i < links.size(); i++) {
if (! links.get(i).attr("href").isEmpty()) {
mData.add(new Question(
(links.get(i).text()).replace("【剑指Offer学习】", "")
.substring(1, (links.get(i).text()).replace("【剑指Offer学习】", "").length()-1),
links.get(i).attr("href")
));
Log.d("TAG", links.get(i).attr("href"));
Log.d("TAG", links.get(i).text() + "\n------------\n");
}
}
Message msg = new Message();
msg.what = 2;
mHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
关键点:
- 分析页面元素
- 获取元素特定参数的值(其实图片的url也是同样的)
- 实体类的封装
- 是否存在无效数据,要将其过滤
其他(本项目没有):
- 需要前往下一页爬取的,可以根据URL中“/page/1”的页数格式,动态循环爬取
最后我们把界面做好,展示数据,就大功告成了:
图2 点开题目后超链接到网页,Toolbar里还有分享按钮:
作为个人的面试复习资料是不是方便很多~
(GitHub项目地址:https://github.com/Yiiip/ProgrammerInterviewGuide)
4. 结语
网页爬虫虽然可以让我们轻松获得来自第三方的数据内容,但是网页的反爬虫手段也陆续出现了,其实多学习一些技术、体会它内在的东西就是对我们有益的,学无止境,大家一起加油吧。
注:转载请遵循CC-BY-NC-ND协议。本文涉及到的内容仅作为学习使用。