Android爬虫之Jsoup

最近做了个获取Kindle特价书的app(https://www.coolapk.com/apk/167660),
使用了jsoup来解析亚马逊的html代码,觉得很强大,遂分享一下。

如图:

Android爬虫之Jsoup_第1张图片

1、Jsoup

介绍

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

地址

Jsoup 官网:https://jsoup.org/

Jsoup 中文文档:http://www.open-open.com/jsoup/

导入

Eclipse 可以下载jar: https://jsoup.org/download

Android studio可以在Gradle中添加:

compile ‘org.jsoup:jsoup:1.11.2’

简单使用

从一个Url中加载Document:

Document doc = Jsoup.connect("http://baidu.com/").get();

获取id为next的a标签:

Element next = doc.getElementById("next");

获取该a标签的href属性:

String nextUrl = next.attr("href");

具体使用方法可以看使用文档: http://www.open-open.com/jsoup/

2、上手

我们以亚马逊Kindle每周特价书为例,地址: https://www.amazon.cn/s/ref=sr_pg_1?rh=n%3A1852543071&sort=popularity-rank&ie=UTF8&qid=1511322011

在浏览器中打开网页(以chrome为例),可以看到如图:

Android爬虫之Jsoup_第2张图片

按F12查看源码,然后按Ctrl+shift+C,然后点击图书的区域,通过查找,我们可以看到如下的源码:

Android爬虫之Jsoup_第3张图片

可以看出来,id为 “s-results-list-atf” 的ul标签,便是商品列表,class为s-result-item的li标签,便是列表item。

那么,我们可以写代码,用户获取所有商品的标签:

    Connection con = Jsoup.connect(url);
// UserAgent是发送给服务器的当前浏览器的信息。
// 这是我的电脑的chrome的userAgent。
con.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
// 获取所有的class 为 "s-result-item"的li标签。
Elements elements = document.getElementsByClass("s-result-item");
for (Element li : elements) {
   ...
}

我们展开每个item的li标签,继续查找,可以看到图片的信息:

Android爬虫之Jsoup_第4张图片

则,我们可以写:

 Element img = li.select("img[alt=产品详细信息]").first();
 // 图片地址
 String imgUrl = img.attr("src");

商品标题和链接:

Android爬虫之Jsoup_第5张图片

// 标题、链接
                    Element aTtile = li.select("a.s-access-detail-page").first();
                    String title = aTtile.attr("title");
                    String bookUrl = aTtile.attr("href");

以此类推,我们可以将本页面的图书图片、标题、链接、作者、评分、评分数量等信息,全部爬出来。同时,不要忘了,我们还要找到下一页的链接:

// 下一页
            Element aNextPage = document.getElementById("pagnNextLink");
            if (aNextPage == null) {
                mNextPageUrl = null;
            } else {
                mNextPageUrl = "https://www.amazon.cn" + aNextPage.attr("href");
            }

这样,我们在上拉加载的时候,就可以通过mNextPageUrl是否为Null,来判断是否还有下一页。

3、其他问题

这篇文章里,我演示的是电脑端网页,而我在app中用的是手机端网页,因为同样的链接,手机端网页比电脑端网页少100kb左右流量(不计算图片)。如果大家要在项目中使用,尽量使用手机端网页比较好一点。
那么,怎么让获取的网页为手机端的呢?
我们修改UserAgent为手机浏览器:

connection.userAgent(String userAgent);

比如我的小米Max2的Via浏览器的UserAgent为:

User-Agent,Mozilla/5.0 (Linux; Android 7.1.1; MI MAX 2 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36

记住,大多数网站的手机端和电脑端的Jsoup分析规则,是不一样的,大家要做区别。

4、总结

记得原来在学校学java的时候,写过一个百度搜索的小软件,可以获取百度搜索出来的结果的前十项,那时候还是用正则来一点一点匹配的。

而现在我们可以用Jsoup简单地实现这些功能,而且Jsoup最大的好处在于 可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,如果你对前端稍微懂点的话,操作起来基本没有什么学习成本的。

你可能感兴趣的:(android)