jsoup编写java爬虫
jsoup是一款简洁轻便的java网络爬虫库,因为它的API与DOM对象操作直接挂钩,所以收到了广泛的欢迎,下面来讲解如何爬取京东上的图书。
因为我是采用的gradle框架来完成集成的,所以可以直接添加jsoup的依赖:
compile('org.jsoup:jsoup:1.10.2')
如果您不使用gradle框架,可以下载jsoup.jar文件。点击下载jar文件,在下载完成后,将上面的 jsoup.jar 添加到项目类库中便可以了。我们定义一个Book类来存放对应的数据:
public class Book {
private String id;
private String name;
private String price;
public Book(){
}
public Book(String id, String name, String price){
this.id=id;
this.name=name;
this.price=price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String toString(){
return "["+id+"="+id+" name="+name+" price="+price+"]";
}
}
找到自己需要爬去的网址,这里使用京东的书城来讲解:https://search.jd.com/Search?keyword=redis&enc=utf-8&qrst=1&rt=1&stop=1&book=y&vt=2&wq=redis&page=3&s=178&click=0
对其网页源码分析可知,书所在的位置是一个ul列表,我们只需要利用jsoup将ul列表中的数据拿出来就可以了,代码如下:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String args[]) throws IOException {
List<Book> list=new ArrayList<>();
String url="https://search.jd.com/Search?keyword=redis&enc=utf-8&qrst=1&rt=1&stop=1&book=y&vt=2&wq=redis&page=1&s=178&click=0";
//取得dom对象
Document doc = Jsoup.connect(url).get();
int count=0;
while (doc!=null){
doc = Jsoup.connect(url).get();
//获取解析其元素
Elements elements=doc.select("ul[class=gl-warp clearfix]").select("li[class=gl-item]");
for (Element ele:elements) {
String bookID=ele.attr("data-sku");
String bookPrice=ele.select("div[class=p-price]").select("strong").select("i").text();
String bookName=ele.select("div[class=p-name]").select("em").text();
Book book=new Book();
book.setId(bookID);
book.setName(bookName);
book.setPrice(bookPrice);
list.add(book);
}
for (Book model:list) {
count++;
System.out.print(model);
System.out.println(" "+count);
}
url=replace(url);
}
}
public static String replace(String s){
int index=s.indexOf("page");
int page=s.charAt(index+5)-48+2;
String s1=s.substring(0,index+5);
String s2=s.substring(index+6,s.length());
return s1+page+s2;
}
}
利用page属性的不同来遍历抓取京东上的书,将其加入list列表中。