Android爬虫之Jsoup

本文介绍如何使用Jsoup解析HTML并抓取亚马逊Kindle特价书信息。通过实例演示了Jsoup的基本用法,包括连接URL、获取元素及属性等。

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

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

### 使用 Jsoup 爬虫时常见错误及其解决方案 当使用 Java 的 Jsoup 库进行网页爬取时,可能会遇到多种类型的 HTTP 错误响应。以下是针对不同错误的具体处理办法。 #### 处理 404 错误 如果目标 URL 返回 404 Not Found 错误,则意味着所请求的资源不存在。为了减少这种错误的发生率,可以通过调整请求头部信息使服务器相信这是来自常规浏览器而非自动化程序发出的访问请求[^5]: ```java Document doc = Jsoup.connect(url) .header("Accept", "text/html,application/xhtml+xml") .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)") .get(); ``` 此外还可以尝试指定 `Referer` 字段来模仿真实的浏览行为: ```java Document doc = Jsoup.connect(url) .referrer("http://example.com/") .get(); ``` #### 解决 521 错误 对于因网络连接问题导致的目标站点暂时不可达的情况(如 521 错误),建议采用重试机制以提高成功率。具体实现方式是在捕获异常后等待一段时间再重新发起相同的请求直到成功为止。值得注意的是,应当合理控制最大重试次数以免造成不必要的负载压力[^4]: ```java int maxRetries = 3; for(int i=0;i<maxRetries ;i++){ try{ Document doc = Jsoup.connect(url).timeout(5 * 1000).get(); break; }catch(IOException e){ Thread.sleep((long)(Math.pow(2,i)*1000)); //指数退避算法 } } ``` #### 绕过反爬措施 某些网站可能设置了严格的防护策略阻止频繁的数据采集活动。此时除了优化请求参数外,还应考虑引入 IP 地址轮换机制以及适当延长两次连续操作间的时间间隔。利用代理服务可以帮助掩盖真实身份并分散风险: ```java Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost,proxyPort)); Connection conn = Jsoup.connect(url); conn.proxy(proxy); // 或者直接调用静态方法设置全局默认代理 System.setProperty("https.proxyHost", proxyHost); System.setProperty("https.proxyPort", String.valueOf(proxyPort)); ``` 另外需要注意的是,部分现代 Web 页面大量依赖 JavaScript 动态渲染内容,单纯依靠 HtmlParser 可能无法获取完整的 DOM 结构。这时就需要借助像 Selenium WebDriver 或 Headless Chrome 这样的工具来进行更复杂的交互式抓取工作[^3]. ### 注意事项 - 尊重各平台的服务条款,合法合规地开展数据收集作业; - 对敏感信息做好加密保护,防止泄露个人隐私资料; - 合理规划任务调度计划表,避免给源站带来过大流量冲击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值