爬取圖片 jsoup
啥都不說,直接上程式碼,粘上來格式有點亂,你們用的時候,直接複製就行了,但是圖片規則需要自己去搞的
package grab;
import java.awt.AWTException;
import java.awt.Robot;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Service {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); //獲取開始時間
//從第三頁開始抓取 到87 頁
for (int i = 3; i <= 87; i++) {
System.out.println("執行第" + (i-2) +"次開始");
try {
getDoc("http://www.youzi4.cc/mm/meinv/index_"+ i +".html");
System.out.println("執行第" + (i-2) +"次結束");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*java中延時去執行,非執行緒 , 如果遇見攔截的可以適當延遲執行檔案
Robot r;
try {
r = new Robot();
System.out.println( "延時前:"+new Date().toString() );
r.delay( 5000 ); //延時5秒執行
System.out.println( "執行第"+i+"次" + new Date().toString() );
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
}
long endTime = System.currentTimeMillis();
System.out.println("開始時間為" + startTime + "結束時間為" + endTime + "程式耗時為" + (endTime - startTime)/60000 + "分鐘" );
}
public static void getDoc(String urll) throws IOException{
File f = new File("E://imgs");
if(!f.exists()){
f.mkdirs();
}
//以網易為例子
//Document doc = Jsoup.connect("http://www.163.com/").get();
Document doc = Jsoup.connect(urll).get();
//獲取字尾為png和jpg的圖片的元素集合
Elements pngs = doc.select("img[src~=(?i)\\.(png|jpe?g)]");
for (Element e : pngs) {
String name = e.attr("alt");
String src=e.attr("src");//獲取img中的src路徑
//獲取字尾名
String imageName = src.substring(name.lastIndexOf("/") + 1,src.length());
// String str = "d62f3df6260c4d3d845b546b6aded87b.png?imageView&thumbnail=453y225&quality=85";
//String str = "";
String pattern = "([?][^?]+)$";//擷取?號 後的資料,並將其替換
String str1 = imageName.replaceAll(pattern,"");
//連線url
URL url = new URL(src);
URLConnection uri=url.openConnection();
//獲取資料流
InputStream is=uri.getInputStream();
//寫入資料流 如果檔名異常,會丟擲異常的
OutputStream os = new FileOutputStream(new File("E://imgs", name + ".png"));
byte[] buf = new byte[5*1024*1024];
int l=0;
while ((l=is.read(buf)) != -1) {
os.write(buf, 0, l);
}
}
}
}