用java去爬取别人的网页上的内容

2/10/2017来源:心得技巧人气:3296

在爬取别人的东西之前,我们需要做一些处理

1.我们先在eclipse中创建一个工程

3. http://mvnrepository.com/artifact/org.jsoup/jsoup/1.10.2,进入这个网站,将下面这段代码复制下来

4.将copy的代码照如下的方式处理

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")));
	}
}