网络爬虫---利用Jsoup爬取京东商品信息(第一版)

前言

  今天周六,公司不加班,早起之后没事做就想玩一下。之前写的爬虫的项目丢了,也找不到了,今天又查询了一些资料又重新写了一个,记录一下实现过程吧.


正文

Jsoup中文API博客地址

  JsoupAPI完整使用手册


Jsoup介绍

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

  但是jsoup有个缺点就是只能获取静态网页资源,由于狗东关于商品的信息,除了商品标题,其他关于评价人数人数以及价格什么的都是通过ajax异步请求获取数据之后来重新赋值,而且你第一次获取的静态资源网页,也只有20条左右的数据,它通过你鼠标滚轮滑动去异步加载数据。这就需要我们通过jsoup去模拟发送ajax请求然后解析json数据。emmm,这个文章就不说这个内容了,我采用的方法是,手动将网页数据加载完成,然后ctrl+s。

  1.导入Jsoup依赖

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

  2.分析狗东数据

  我们在狗东搜索,电脑查看商品信息可以发现,他的每一个商品对应的class名都是gl-item,但是我们可以发现,gl-item中依然有多余的内容,我们只需要根据gl-i-wrap就可以获取一个商品的所有标签了。实际上我也是这么做的,
在这里插入图片描述

  3.书写代码

public static void main(String[] args) throws IOException {
		//本地文件的路径
		File html =new File("C:/Users/asus/Desktop/1.html");
		//获取网页文本
		Document document = Jsoup.parse(html, "UTF-8");
		//指定存储文件的路径
		File path = new File("G:/study/jdimg");
		if (!path.exists()) {
			path.mkdirs();
		}
		//根据类名选择商品
		Elements items = document.getElementsByClass("gl-i-wrap");
		for (Element element : items) {
			//获取图片标签信息
			Element p_img = element.getElementsByClass("p-img").first();
			//获取图片中的a标签
			Element p_img_a = p_img.getElementsByTag("a").first();
			//获取a标签中的title值,对应的商品标题
			String itemTitle = p_img_a.attr("title");
			//获取a标签中的url值,对应的商品连接
			String itemUrl = p_img_a.attr("href");
			//获取价格信息   --获取价格标签,然后找到价格中的i标签,获取文本信息
			String p_price = element.getElementsByClass("p-price").first().getElementsByTag("i").first().text();
			//获取评价信息
			String p_commit = element.getElementsByClass("p-commit").first().getElementsByTag("strong").first().text();
			//获取卖家信息
			String p_shop = element.getElementsByClass("p-shop").first().getElementsByTag("a").first().text();
			//下载图片
			//刚才我们拿到的是商品的详情界面,我们连接这个页面,分析页面可以知道商品的图片信息就在id=spec-img的标签中
			//拿到这个dom元素后,获取图片的地址
			Document itemInfo = Jsoup.connect(itemUrl).get();
			Element itemImg = itemInfo.getElementById("spec-img");
			URL url = new URL("http:"+itemImg.attr("data-origin"));
			String filename = ""+System.currentTimeMillis();
			// 获得连接
			URLConnection connection = url.openConnection();
			// 设置10秒的相应时间
			connection.setConnectTimeout(10 * 1000);
			// 获得输入流
			InputStream in = connection.getInputStream();
			// 获得输出流
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(path+"/"+filename+".png"));
			// 构建缓冲区
			byte[] buf = new byte[1024];
			int size;
			// 写入到文件
			while (-1 != (size = in.read(buf))) {
				out.write(buf, 0, size);
			}
			out.close();
			in.close();
			System.out.println("图片地址:"+itemUrl+"\n商品标题:"+itemTitle+
					"\n商品价格:"+p_price+"\n评价人数:"+p_commit+"\n卖家信息:"+p_shop+"\n文件名称:"+filename);
			System.out.println("---------------------------");
		
		
	}

  4.效果展示

  数据信息:
在这里插入图片描述
  图片信息:
在这里插入图片描述


总结

  总体来说jsoup使用方法还是比较人性化的,只需要你有前端的基础就可以爬取到想要的信息了,当然了,存本地这种方式确实比较蠢,有没有什么好的办法呢?当然有,我们可以分析页面的请求,模拟发起。这篇文章不再讨论。那么可能会有人问,你这图片爬取了有什么用吗?在这里我可以告诉大家,并没什么用,只不过是告诉你们如何爬取图片,因为你们用的时候,肯定会有这个需求。不多解释了。
  咸鱼IT技术交流群:89248062,在这里有一群和你一样有爱、有追求、会生活的朋友! 大家在一起互相支持,共同陪伴,让自己每天都活在丰盛和喜乐中!同时还有庞大的小伙伴团体,在你遇到困扰时给予你及时的帮助,让你从自己的坑洞中快速爬出来,元气满满地重新投入到生活中!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章