java爬取百度图片

       公司智能分析部的一位同事遇到难题了,他正阵子做人脸识别,经理给他的图片来源都是外国图片,他想用中国的人脸来作测试,当然最好是中国明星,但是又嫌从百度上一张一张下载比较麻烦,于是找我帮个忙,看看能不能解决。恰巧之前用Java弄过从网络上下载图片,于是我就答应他工作之余一起来想办法。刚开始我用Jsoup来做,后来发现Jsoup获取不到百度图片的地址,因为百度图库的图片是JS异步加载的,网上找了很多资料,竟然发现没有关于下载百度图片的相关实例代码,最后让我庆幸的是原来开源的HtmlUnit可以帮我解决这个问题,让我有种“山重水复疑无路,柳暗花明又一村”的感觉。

        下面我就以从百度下载张学友为例进行分析:

步骤1:打开百度图库(http://image.baidu.com/),在检索框内输入“张学友”,点击“百度一下”。


步骤2:看到检索结果,红框区就是我们要下载的图片

步骤3:点击第一张图片,会看到一个大图,我们通常会右键下载
java爬取百度图片_第1张图片
步骤4:现在我们不妨试着用程序去把拿到这张大图的原地址(最关键)
java爬取百度图片_第2张图片

步骤5:根据图片原地址去下载到本地文件夹。
java爬取百度图片_第3张图片

注意:百度图片是根据百度算法去一些网站爬取的,然后Copy一份到百度数据库,经验告诉我,如果去访问百度数据库的图片可能经常会碰到403禁止访问的情况,所以建议各位先获取到图片原网站的地址,根据原图片网络地址去下载。好处有两个,一是保证可以正常下载,二是下载的图片比较高清。


代码实现:

package com.kendy.spider;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.List;

import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;


public class SpiderFromBaidu {

	public static void main(String[] args) throws Exception {
		WebClient webClient=new WebClient();
		webClient.getOptions().setCssEnabled(true);
		webClient.getOptions().setJavaScriptEnabled(true);
		webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
		webClient.setAjaxController(new NicelyResynchronizingAjaxController());  
        webClient.waitForBackgroundJavaScript(600*1000);  
          
        String url = "http://image.baidu.com/";

		HtmlPage page=webClient.getPage(url);
		sop("get page success...");

	    final HtmlForm form = page.getFormByName("f1");
	    final HtmlTextInput textField = form.getInputByName("word");
	    textField.setValueAttribute("张学友");

		List list = page.getByXPath("//form/span/input[@type=\"submit\"]");
		HtmlSubmitInput go = (HtmlSubmitInput)list.get(0);
		HtmlPage p =(HtmlPage)go.click();
		webClient.waitForBackgroundJavaScript(3*1000); 
		 
		List imgList = p.getByXPath("//div[@class='list']/div/div[@class='imgshadow']");
		HtmlDivision imgDiv = null;
		HtmlAnchor link = null;
		HtmlElement element = null;
		String str=null;
		int begin=0;
		int end = 0;
		int k=1;
		for(int i=0;i0){
						sop("creat document file \""+path.substring(0,path.length()-1)+"\" success...\n");
					}
				}
			}else{
			file = new File(path+downloadName);
			fos = new FileOutputStream(file);
			if(url.startsWith("http")){
				urlObj = new URL(url);
				con = urlObj.openConnection();
				httpCon =(HttpURLConnection) con;
				in = httpCon.getInputStream();
				while((num=in.read(size)) != -1){
					for(int i=0;i


你可能感兴趣的:(java)