在爬取別人的東西之前,我們需要做一些處理
1.我們先在eclipse中創建一個工程
5.點擊保存,然后jsoup這個包就被我們引入,這時候就可以正式開始從網頁上爬取別人的資料了
package com;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.*;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class getPIcDemo { //1.從多圖片的網頁中獲取眾多的圖片的地址,url代表網頁的網址 public static List getmanyPicAdress(String Url) { List<String> list=new ArrayList<>(); try {//我們先將url網絡里面的 Document document=Jsoup.connect(Url).get(); //我們預先知道這個網頁里面的圖片的class屬性的“relative block works-detail hover-none works-img-box”是唯一的, //所以就得到了這些元素 //這些元素里面就包含了想要的信息 Elements elements=document.getElementsByAttributeValue("class", "relative block works-detail hover-none works-img-box");// 在elements中我們獲取了多個element,element中就包含了網頁鏈接 for (int i = 0; i < elements.size(); i++) {// 循環輸出element, Element element=elements.get(i);// 這時候,element.attr("href")就可以將href里面包含的網頁鏈接內容寫出來 list.add(element.attr("href")); } } catch (IOException e) { // TODO Auto-generated catch block e.PRintStackTrace(); } return list;//我們用鏈表將所有的href里面的數據儲存起來,最好不要用數組,因為我們不知道href數據有多少個 } // 2.第一個方法,我們用getmanyPicAdress方法獲取到了圖片的詳細地址,現在我們要做的,就是從圖片的詳細地址中獲取圖片的下載地址// 將第一個方法獲得的鏈表值作為參數傳入到函數中 public static List getPicAdress(List list) { List<String> list1=new ArrayList<>();// 用循環讀取一個個的鏈表里的內容(圖片的詳細地址) for(int i=0;i<list.size();i++){ try {// 新建一個string,用來存儲list里面的數據 String st=(String)list.get(i);// 將string讀取的數據存入到document中 Document document =Jsoup.connect(st).get();// 因為我們找到的關于圖片下載地址的唯一標識符,是class="works-img",先用elements將圖片的下載地址找到 Elements elements=document.getElementsByAttributeValue("class", "works-img");// 再用element讀出elements的數據 for(int m=0;m<elements.size();m++){ Element element=elements.get(m);// 最后用新的一個鏈表將數據裝起來,并且返回 list1.add(element.attr("src")); } } catch (IOException e) { e.printStackTrace(); } } System.out.println(list1);// 返回數據所獲得的圖片下載地址的值 return list1; } //3.用下載地址,下載圖片// 將第二個方法返回的裝載圖片下載地址的鏈表作為參數返回鏈表 public static void test(List list) { URL myurl; InputStream is = null; OutputStream os = null; try {// 我們還是要用循環將鏈表里面的數據一個個讀取出來,讓后一個個的去下載 for (int i = 0; i < list.size(); i++) {// 還是用一個新的字符串去存儲list讀出來的數據 String string=(String) list.get(i); // 因為涉及到圖片的存儲問題,名字顯然不能一樣,所以就讓從圖片的末尾的信息作為文件名// 從最后一個“/”開始讀取, int beginIndex=string.lastIndexOf("/");// 文件名就以最后一個/開始,直到結束 String picName=string.substring(beginIndex+1); // 下列是根據鏈接讀取圖片的信息并儲存的方法,不再贅述 myurl=new URL(string); is=myurl.openConnection().getInputStream(); byte byte1[]=new byte[102400]; os=new FileOutputStream(picName); int len; while((len=is.read(byte1))!=-1){ os.write(byte1, 0, len); } os.flush(); } os.close(); is.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { test(getPicAdress(getmanyPicAdress("http://www.nipic.com/photo/jingguan/index.html"))); }}
新聞熱點
疑難解答