欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA之爬虫jsoup实现

程序员文章站 2022-05-05 15:06:01
...

JAVA之爬虫jsoup实现

前几天做了一道题,就是关于爬取手机信息的一个爬虫,我在查阅了一些资料后决定使用jsoup来实现,可以基本完成功能,但是由于这些网页有懒加载机制,也就是有异步请求,所以数据不是很全,但可以拿到70%左右的数据,接下来我详细介绍一下。

准备工作

1.创建Maven项目,将jsoup依赖写入pom.xml文件中,这个网上教程很多,不叙述了。
2.打开浏览器。
3.打开查看器查看要爬取的信息页面元素。

话不多说上代码

相关解释我直接在注释中说明。

package main;

import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
//上面是一些导包
import bean.MobilePhone;

public class Doing {
	private int count = 0;
	private MobilePhone mobile = new MobilePhone();

	public void doAll() throws Exception {
		int page = 1;
		//初始URL,这个URL是直接在浏览器URL栏中复制得到的
		String url="https://search.jd.com/Search?keyword=三星手机&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&bs=1&suggest=1.his.0.0&ev=exbrand_三星(SAMSUNG)^&page=";
		
		for(int i=1;i<50;i++ ) {
			//获取每一页的URL地址
			/*这里解释一下,这个URL有一些参数是无用的,最后我发现如果想要换页是     page的值不同且是1、3、5......这样递增的,所以下面我是拼接的每一页地址。
			*/
			String realUrl = url+String.valueOf(page);
			getAllPage(realUrl);
			System.out.println("完成第:"+i+"页");	
			page = page + 2;
		}
		//count用来计数获取到的数量
		System.out.println("总共完成了"+count+"个商品");
	}
		
		
	//完成一整页
	public void getAllPage(String url) throws Exception {
		Document doc = Jsoup.connect(url)
				.method(Method.GET).timeout(60000).maxBodySize(0).get();
		Elements uiList = doc.select("ul[class='gl-warp clearfix']").select("li[class='gl-item']");
		//获取到商品简略页的信息
		for (Element element : uiList) {
			Elements pricee = element.select("div[class='p-price']");
			//获取价格,因为详情页拿不到价格,所以在简略拿了价格。
			String price = pricee.select("i").text();
			if(!price.equals("")){
				mobile.setPrice(price);
			}
			//找到详情页的URL
			String href= element.select("div[class='p-name p-name-type-2']").select("a").attr("href");
			String[] hrefs = href.split("//");
			//测试中发现有些地址没有加协议,所以判断了一下后加入了协议
			if(hrefs[0].equals("")) {
				href = "https:"+href;
			}
			//进入获取
			this.getEachMobileMessage(href);
			count++;
			mobile = new MobilePhone();
		}

	}
	//完成详情页
	public  void getEachMobileMessage(String url) throws Exception {
		Document doc = Jsoup.connect(url).maxBodySize(0).get();
		//获取手机商品各项信息
		Elements ulList1 = doc.select("ul[class='parameter2 p-parameter-list']");	
		Elements liList = ulList1.select("li");
		//这里使用indexOf()是为了模糊匹配 
		for (Element element : liList) {
			String[] kv = element.text().split(":");
			if("商品名称".equals(kv[0])) {
				mobile.setMoblieName(kv[1]);
			}else if(kv[0].indexOf("内存") != -1){
				mobile.setMemory(kv[1]);
			}else if(kv[0].indexOf("电池") != -1) {
				mobile.setBatteryCapacoty(kv[1]);
			}else if(kv[0].indexOf("颜色") != -1) {
				mobile.setColor(kv[1]);
			}else if(kv[0].indexOf("像素") != -1){
				mobile.setCameraPi(kv[1]);
			}
			
		}
		//显示爬取到的手机信息
		System.out.println(mobile);
	}
}

上面为了输出手机信息不停的new也没出问题应该是JAVA的垃圾回收机制的帮助(个人见解)。

总结

1.算是个爬虫入门吧,基本可以自己爬一些信息了。
2.不足之处是不能爬到懒加载的东西,这个可能需要脚本或者模拟器的帮助了。
3.主要还是用了jsoup包,总感觉太依赖包了,希望以后可以自己开发一些可扩展的工具。