最近做了个获取Kindle特价书的app(https://www.coolapk.com/apk/167660),
使用了jsoup来解析亚马逊的html代码,觉得很强大,遂分享一下。
如图:
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为例),可以看到如图:
按F12查看源码,然后按Ctrl+shift+C,然后点击图书的区域,通过查找,我们可以看到如下的源码:
可以看出来,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标签,继续查找,可以看到图片的信息:
则,我们可以写:
Element img = li.select("img[alt=产品详细信息]").first();
// 图片地址
String imgUrl = img.attr("src");
商品标题和链接:
// 标题、链接
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的操作方法来取出和操作数据,如果你对前端稍微懂点的话,操作起来基本没有什么学习成本的。