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