android爬虫框架jsoup,Android爬虫之Jsoup

最近做了个获取Kindle特价书的app(https://www.coolapk.com/apk/167660),

使用了jsoup来解析亚马逊的html代码,觉得很强大,遂分享一下。

如图:

1516b6af04c0

效果

1、Jsoup

介绍

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

地址

导入

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");

2、上手

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

1516b6af04c0

每周特价书页面

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

1516b6af04c0

网页源码

可以看出来,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标签,继续查找,可以看到图片的信息:

1516b6af04c0

商品图片

则,我们可以写:

Element img = li.select("img[alt=产品详细信息]").first();

// 图片地址

String imgUrl = img.attr("src");

商品标题和链接:

1516b6af04c0

商品标题

// 标题、链接

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的操作方法来取出和操作数据,如果你对前端稍微懂点的话,操作起来基本没有什么学习成本的。