JAVA之爬虫jsoup实现

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包,总感觉太依赖包了,希望以后可以自己开发一些可扩展的工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Jsoup 是一个开源的 HTML 解析器库,可以用来实现简单的 Web 页面爬取。以下是一个简单的 Java Jsoup 爬虫实现: 1. 导入 Jsoup 库 首先需要在项目中导入 Jsoup 库,可以在 Maven 中添加以下依赖: ``` <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency> ``` 2. 获取页面内容 通过 Jsoupconnect() 方法连接指定的 URL,并使用 get() 方法获取页面内容,如下所示: ``` String url = "https://www.example.com"; Document doc = Jsoup.connect(url).get(); ``` 3. 解析页面内容 使用 Jsoup 的 select() 方法选择页面中需要抓取的元素,并使用 text() 或者 attr() 方法获取其文本内容或属性值,如下所示: ``` Elements links = doc.select("a[href]"); for (Element link : links) { String href = link.attr("href"); String text = link.text(); System.out.println(text + " -> " + href); } ``` 以上代码会抓取页面中所有的链接,然后输出链接的文本和地址。 4. 完整代码 ``` import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class MyCrawler { public static void main(String[] args) { String url = "https://www.example.com"; try { Document doc = Jsoup.connect(url).get(); Elements links = doc.select("a[href]"); for (Element link : links) { String href = link.attr("href"); String text = link.text(); System.out.println(text + " -> " + href); } } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码可以抓取指定页面中的所有链接,并输出链接的文本和地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值