Android Jsoup网页爬虫—>程序猿面试指南App

本文介绍使用Jsoup进行网页爬虫的实践过程,包括Android环境下Jsoup的配置与使用方法,通过具体案例展示了如何抓取指定网站上的面试题资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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”的页数格式,动态循环爬取

最后我们把界面做好,展示数据,就大功告成了:

界面1  界面2

图2 点开题目后超链接到网页,Toolbar里还有分享按钮:

界面2-1

作为个人的面试复习资料是不是方便很多~

(GitHub项目地址:https://github.com/Yiiip/ProgrammerInterviewGuide

4. 结语

网页爬虫虽然可以让我们轻松获得来自第三方的数据内容,但是网页的反爬虫手段也陆续出现了,其实多学习一些技术、体会它内在的东西就是对我们有益的,学无止境,大家一起加油吧。



注:转载请遵循CC-BY-NC-ND协议。本文涉及到的内容仅作为学习使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值