0
点赞
收藏
分享

微信扫一扫

一口气学会爬虫之Jsoup

残北 2022-02-26 阅读 67

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

引入依赖包

<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	 <version>1.11.3</version>
</dependency>

解析的方式

// 方式一
Document document = Jsoup.connect("https://item.jd.com/100016136249.html").get();
// 方式二
Document parse = Jsoup.parse(new URL("https://item.jd.com/100016136249.html"), 1000 * 10);

解析
其中Jsoup.connect(“xxx”)方法返回一个org.jsoup.Connection对象。
在Connection对象中,我们可以执行get和post来执行请求。但在执行请求之前,我们可以使用Connection对象来设置一些请求信息。比如

//从URL获取HTML来解析
Document doc = Jsoup.connect("http://www.baidu.com/").get(); 
String title = doc.title();
//头信息,cookie,请求等待时间,代理等等模拟浏览器行为。
Document doc = Jsoup.connect("http://example.com") 
.data("query", "Java") 
.userAgent("Mozilla") 
.cookie("auth", "token") 
.timeout(3000) .post();

元素选取

使用DOM的方式来取得

	getElementById(String id)//通过id来获取
  getElementsByTag(String tagName)//通过标签名字来获取
  getElementsByClass(String className)//通过类名来获取
  getElementsByAttribute(String key)//通过属性名字来获取
  getElementsByAttributeValue(String key, String value)//通过指定的属性名字,属性值来获取
  getAllElements()//获取所有元素

通过类似于css或jQuery的选择器来查找元素

public Elements select(String cssQuery)

//举例
Elements links = doc.select("a[href]"); //带有href属性的a元素
Elements pngs = doc.select("img[src$=.png]");

从Element对象中,取出我们真正需要的内容

Element.text()
//这个方法用来取得一个元素中的文本。
Element.html()Node.outerHtml()
//这个方法用来取得一个元素中的html内容
Node.attr(String key)
//获得一个属性的值,例如取得超链接<a href="">中href的值

至此,学习的jsoup基础就已经可以做爬虫了,接下来是爬虫代码

		//爬取搜索页面的图片、书名、价格、出版社
		//获取请求
        String url = "https://search.jd.com/Search?keyword=java";
        // 解析网页 (Jsou返回的Document就是浏览器的Docuement对象)
        Document document = Jsoup.parse(new URL(url), 30000);
        //获取id,所有在js里面使用的方法在这里都可以使用
        Element element = document.getElementById("J_goodsList");
        //获取所有的li元素
        Elements elements = element.getElementsByTag("li");
        //用来计数
        int c = 0;
        //获取元素中的内容  ,这里的el就是每一个li标签
        for (Element el : elements) {
            c++;
            //这里有一点要注意,直接attr使用src是爬不出来的,因为京东使用了img懒加载
            String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");
            //获取商品的价格,并且只获取第一个text文本内容
            String price = el.getElementsByClass("p-price").eq(0).text();
            String title = el.getElementsByClass("p-name").eq(0).text();
            String shopName = el.getElementsByClass("p-shopnum").eq(0).text();
            //打印爬取结果
            log.info("{}-{}-{}-{}",img,price,title,shopName);
        }

        return "";
 public HashMap<String, Object> getJdData(String url) throws IOException {

        HashMap<String, Object> map = new HashMap<>();

        List<String> list = new ArrayList<>();
        
        Document document = Jsoup.parse(new URL(url), 30000);

        //商品名称
        String goodsName = document.getElementsByClass("sku-name").eq(0).text();
        list.add(goodsName);
        log.info(goodsName);
        map.put("goodsName", "商品名称:" + goodsName);

        Element elements = document.getElementById("spec-list");

        Elements imgs = elements.getElementsByTag("li");

        list = new ArrayList<>();
        //图片
        for (Element img : imgs) {
            String src = img.getElementsByTag("img").attr("data-url");
            list.add("https://img13.360buyimg.com/n0/" + src);
            log.info("https://img13.360buyimg.com/n0/" + src);
        }
        map.put("images", list);

        list = new ArrayList<>();
        //价格
        String jdId = document.getElementsByClass("price").attr("class").replace("-p", "").replace("price ", "").replace("-", "_");
        String httpUrl = "http://p.3.cn/prices/get?skuid=" + jdId;
        String body = HttpRequest.get(httpUrl).body();
        String price = JSON.parseObject(JSON.parseArray(body).get(0).toString()).get("p").toString();
        list.add("价格:" + price);
        log.info(price);
        map.put("price", "价格:" + price);


        list = new ArrayList<>();
        //类目属性
        Element element = document.getElementsByClass("parameter2 p-parameter-list").get(0);
        Elements lis = element.getElementsByTag("li");
        for (Element li : lis) {
            list.add(li.text());
            log.info(li.text());
        }
        map.put("param", list);

        String spuString = document.data().toString();
        //Matcher matcher = Pattern.compile("mainSkuId(.+?\\&)").matcher(spuString);
        Matcher matcher = Pattern.compile("desc: (.+?\\',)").matcher(spuString);
        boolean b = matcher.find();
        String spuDataUrl = matcher.group().replace("desc: '", "http:").replace("',", "");

        list = new ArrayList<>();
        //详情图
        String detailBody = HttpRequest.get(spuDataUrl).body();
        JSONObject jsonObject = JSON.parseObject(detailBody);
        String content = jsonObject.get("content").toString();
        String pattern = "//(.+?\\.jpg)";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(content);
        while (m.find()) {
            list.add("http:" + m.group());
            log.ingo("http:{}",m.group());
        }
        map.put("details", list);

        return map;
    }
举报

相关推荐

0 条评论