jsoup爬取某东数据

1,358 阅读2分钟

jsoup爬取某东数据

免责声明:本文所记录的技术手段及实现过程,仅作为爬虫技术学习使用,不对任何人完全或部分地依据本文的全部或部分内容从事的任何事情和因其任何作为或不作为造成的后果承担任何责任

jsoup介绍

jsoup is a Java library for working with real-world HTML. It provides a very convenient API for fetching URLs and extracting and manipulating data, using the best of HTML5 DOM methods and CSS selectors.

翻译成中文:

jsoup是一个用于处理真实世界HTML的Java库。它提供了一个非常方便的API,用于获取URL、提取和操作数据,使用最好的HTML5 DOM方法和CSS选择器。

百度百科的解释:

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

具体实践

1. 目的

获取搜索到的商品图片链接、名称、价格、评价数量,获取到排序,看哪种商品的评价数量最多

2. 引入依赖

    <!-- jsoup 网页爬虫 -->
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.15.4</version>
    </dependency>

2. 分析、编写代码

分析某东搜索页面的元素组成,打开F12,选择左上角的箭头,选择一个元素的区域

image-20230419214208988-1681916898451.png 可以看到上图中ID为 J_goodsList 的区域就是搜索结果的区域,我们取到这个元素,然后遍历他下面的所有 calss 为 gl-item 以获取到本页面的所有信息

@Override
    public List crawlerJdByKeyword(String keywork) {
        List<Map<String, Object>> list = new ArrayList<>();
        String url = "https://search.jd.com/Search?keyword=" + keywork;
        try {
            Document document = Jsoup.connect(url).get();
            Element j_goodsList = document.getElementById("J_goodsList");
            Elements lis = j_goodsList.getElementsByClass("gl-item");
            for (Element li : lis) {
                String imageUrl = li.getElementsByClass("p-img").get(0).getElementsByTag("img").get(0).attr("data-lazy-img");
                String name = li.getElementsByClass("p-name").get(0).getElementsByTag("em").get(0).text();
                String priceStr = li.getElementsByClass("p-price").get(0).getElementsByTag("i").get(0).text();
                Double price = 0.00;
                try {
                    price = Double.parseDouble(priceStr);
                } catch (NumberFormatException e) {
                    log.error("价格转换失败", e);
                }
                // 经过试验,commit 字段获取不到,因为返回的HTML中没有这些信息
                String commit = li.getElementsByClass("p-commit").get(0).getElementsByTag("strong").get(0).getElementsByTag("a").text();
                Double finalPrice = price;
                list.add(new HashMap<String, Object>() {{
                    put("imageUrl", imageUrl);
                    put("name", name);
                    put("price", finalPrice);
                    put("commit", commit);
                }});
            }
        } catch (IOException e) {
            log.error("爬取京东失败", e);
        }
        return list;
    }

3. 测试功能

    public static void main(String[] args) {
        JsoupService jsoupService = new JsoupServiceImpl();
        List list = jsoupService.crawlerJdByKeyword("手机");
        System.out.println(list);
    }

获取到的结果为:

image-20230419230310697.png

commit 字段获取不到,因为返回的HTML中没有这些信息,猜测是为了反爬和网站的响应速度,异步填充加载的

以后再好好研究一下怎么给他弄过来。

好了,一个简单的HTML元素爬取样例就完成了

分享一句诗:宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒

本人小白,才疏学浅,大佬们轻点喷