JAVA编写一个小爬虫

最近在运用自己所学的前端知识和后端java程序语言做一个家庭网站,网站中有一个模块是需要添加动态图片,所以打算做个爬虫爬去一些搞笑的GIF图片。
首先使用Jsoup作为客户端发送链接并获得返回的Document文档,并通过jsoup自带的解析方法得到图片地址
public class Get_Document_ByJSOUP implements GetHtml{
	public Document GetHtmlDocumentBy_JSOUP(String Url){
		try {
			Document doc = Jsoup
					.connect(Url)
					.header("Accept", "*/*")
					.header("Accept-Encoding", "gzip, deflate")
					.header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
					.header("Content-Type", "application/json;charset=UTF-8")
					.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
					.timeout(10000).get();
			return doc;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
			
		
		
	}
}

通过对返回的文档进行解析后,准备进行下载,但是碰到了一个情况现在我也搞不清楚,立一个问题方便以后去解决

public class Download_picture_II implements Url_Download{
private static String  FileName=null;
	
	public  Download_picture_II() {
		this.FileName="F:\\EPWO1\\WXGC_Reptile\\DOWN\\Downpicture";
	}
	public  Download_picture_II(String file ) {
		this.FileName=file;

	}
	/*
	 * BufferedInputStream bos  = response.bodyStream();获取的流总是得到1m的数据,无论io中数据是否有还是超过
	 * 输入链接与保存的文件名,将下载至指定的目录中
	 */
	public static void Download_Picture(String url,String filename)  {
		// TODO Auto-generated method stub
//		System.out.println("卡住");
		 Connection.Response response;
		try {
			response = Jsoup.connect(url)
						.header("Accept", "*/*")
						.header("Accept-Encoding", "gzip, deflate")
						.header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
						.ignoreContentType(true)
						.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
						.execute();
		
		 BufferedInputStream bos  = response.bodyStream();
		 String name=FileName+"/"+filename;
		 System.out.println(" Download_Picture卡住运行");
		 byte[] bs = new byte[1024*1024];
		 int len,size=0,count=0;
		 
	       // 输出的文件流
		 FileOutputStream os = new FileOutputStream(name, true);
	       // 开始读取
	       while ((len =  bos.read(bs)) != -1) {
	    	   
	    	   size+=len;
	    	   System.out.println( "len"+len);
	    	   count++;
	    	   os.write(bs , 0, len);
	       }
	       System.out.println( "size"+size+"-----count"+count);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		       
	}	
}

url为图片链接地址,filename是它的保存文件名,BufferedInputStream bos = response.bodyStream();获取返回的流后在进行读取的过程中,bos.read(bs)无论图片有多大,它传输的数据总量size=10241024.按道理来说数据总量应该是图片的源文件大小,而且循环count总是在1024左右,就是为了调整size的大小为10241024.(此方法获取的图片是正常的)
查了一下相关资料,大概意思是服务器返回的数据流没有按规定关闭,导致len = bos.read(bs)一直不等于-1,但是我还是想不出其中的机制,如果有知道 的朋友麻烦底下解决一下。
另外,我换个获取流的方式,数据显示也就符合真实情况了,在这里附上源码。

public class Download_picture_V implements Url_Download{
private static String  FileName=null;
	
	public  Download_picture_V() {
		this.FileName="F:\\EPWO1\\WXGC_Reptile\\DOWN\\Downpicture";
	}
	public  Download_picture_V(String file ) {
		this.FileName=file;

	}
	/*
	 * 
	 * 输入链接与保存的文件名,将下载至指定的目录中
	 */
	public static void Download_Picture(String url,String filename)  {
		// TODO Auto-generated method stub
//		System.out.println("卡住");
		 Connection.Response response;
		try {
			response = Jsoup.connect(url)
						.header("Accept", "*/*")
						.header("Accept-Encoding", "gzip, deflate")
						.header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
						.ignoreContentType(true)
						.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0")
						.execute();
		
			
		 String name=FileName+"/"+filename;
		 System.out.println(" Download_Picture_V卡住运行");
		 byte[] bs= response.bodyAsBytes();
		 FileOutputStream os = new FileOutputStream(name, true);
		 BufferedOutputStream bos = new BufferedOutputStream(os);
		 System.out.println( "bs.size"+bs.length);
		 bos.write(bs);
		 bos.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}	
}

[Github项目源码]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值