jsoup編寫java爬蟲
阿新 • • 發佈:2018-11-12
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列表中。