在爬取别人的东西之前,我们需要做一些处理
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"))); }}
新闻热点
疑难解答