一、Jsoup
- Jsoup是一款java版的HTML解析器,可直接解析某个URL地址、HTML文本内容。
- 解析网页后返回的是一个Document 对象实例,我们可以看到document中有很多类似js的方法
-
根据相应的标签找到对象的属性,最后输出我们需要的东西即可。
二、爬取京东商城页面
1. 创建项目,导入依赖
- 首先创建一个Maven项目,在pom.xml中加入Jsoup的依赖,我们可以在Maven仓库中查找依赖的代码。
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
2. 分析网页
- 首先我们打开京东搜索的网页,通过开发者工具可以发现,输入框的id是keyword。
- 我们在搜索框中输入java,可以看到页面跳转到这个网址https://search.jd.com/Search?keyword=java,随后我们找到整个商品的div,如下图所示,它的id为“J_goodsList”
- 展开 div 标签后,可以发现有很多 li 标签,每一个 li 标签都对应着一本书
- 展开 li 标签可以看到关于这本书的所有信息,包括图像img,价格p-price,书名p-name等等,我们接下来就要对这些信息进行抓取。
- 但是因为对于图片特别多的网站,所有的图片都是延迟加载的,也就是懒加载,所以展开p-img会发现真正的图片链接在“source-data-lazy-img”中
3.代码编写
HtmlParseUtil类
package JDParse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import dao.Content;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class HtmlParseUtil {
public static void main(String[] args) throws Exception {
//搜索词可以更换,此处以java为例
List goodList = new HtmlParseUtil().ParseJD("java");
for (Object o : goodList) {
System.out.println(o);
System.out.println("======================");
}
}
public List<Content> ParseJD(String keywords) throws Exception {
//获取url请求
String url = "https://search.jd.com/Search?keyword=" + keywords;
//解析网页,Jsoup返回的是Document对象(浏览器Document对象)
Document document = Jsoup.parse(new URL(url), 10000);
//所有在js中使用的方法,这里都能使用
Element element = document.getElementById("J_goodsList");
//在获得网页内容后,获取所有的li标签
Elements elements = element.getElementsByTag("li");
ArrayList<Content> goodList = new ArrayList<Content>();
//获取元素的标签后,再获取标签中的内容
for (Element el : elements) {
//关于图片特别多的网站,所拥有的图片都是延迟加载的(懒加载)
// source-data-lazy-img
String img = el.getElementsByTag("img").eq(0).attr("source-data-lazy-img");
String price = el.getElementsByClass("p-price").eq(0).text();
String name = el.getElementsByClass("p-name").eq(0).text();
Content content = new Content();
content.setTitle(name);
content.setImg(img);
content.setPrice(price);
goodList.add(content);
}
return goodList;
}
}
Content类
package dao;
public class Content {
private String title;
private String img;
private String price;
public Content() {
}
public Content(String title, String img, String price) {
this.title = title;
this.img = img;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "Cotent{" +
"title='" + title + '\'' +
", img='" + img + '\'' +
", price='" + price + '\'' +
'}';
}
}
4.测试运行
- 截取部分运行结果来看一下最终效果