IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> java批量获取百度图片 -> 正文阅读

[移动开发]java批量获取百度图片

java获取百度图片学习记录

主要用到的jar包

        <dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
		</dependency>

分析百度加载url,每次请求加载30张图片,主要有参数pn控制,gsm为pn的16进制,最后是时间戳,搜索内容有queryWord控制

https://image.baidu.com/search/acjson?tn=resultjson_com&logid=7312553249612451609&ipn=rj&ct=201326592&is=&fp=result&fr=&word=%E7%BE%8E%E6%99%AF&queryWord=%E7%BE%8E%E6%99%AF&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn=30&rn=30&gsm=1e&1646700092850=

可以写一个实体类用来设置url

public class PageUrl {

	private String queryWord; 
	private int pn; 
	private String gsm; 

	public PageUrl(String queryWord, int pn) {
		// 对查询关键字进行url编码
		try {
			this.queryWord = URLEncoder.encode(queryWord, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		this.pn = pn;
		this.gsm = Integer.toHexString(pn);
	}

	// pn 和 gsm 应该是一起变化的
	public void setPn(int pn) {
		this.pn = pn;
		this.gsm = Integer.toHexString(pn);
	}

	@Override
	public String toString() {
		return "http://image.baidu.com/search/acjsontn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord="
				+ queryWord + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word="
                + queryWord + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn="                                                          
                + pn+ "&rn=30&gsm=" + gsm + "&" + new Date().getTime() + "=";
	}
}

编写实现类

public class PicSpider {

	public void crawlePicture(String queryWord, int page) throws Exception {
		if (page < 1) {
			throw new Exception("page set error.");
		}
		PageUrl pageUrl = new PageUrl(queryWord, 30); /
		for (int i = 1; i <= page; i++) {
			pageUrl.setPn(i * 30);
			getJson(pageUrl.toString());
		}
	}
	public String getJson(String url) {
		String json = null;
		try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
			HttpGet getMethod = new HttpGet(url);
			setHeaders(getMethod);
			try (CloseableHttpResponse response = httpClient.execute(getMethod)) {
				int statusCode = response.getStatusLine().getStatusCode();
				if (statusCode == HttpStatus.SC_OK) {
					HttpEntity entity = response.getEntity();
					if (entity != null) {
						json = EntityUtils.toString(entity, "UTF-8");
						resolveJson(json);
					}
				} else {
					throw new IOException("请求失败:" + statusCode);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return json;
	}

	public List<String> resolveJson(String json) {
		// 使用正则表达式,进行匹配,获取 objURL
		String regx = "\"thumbURL\":\"(.*?)\",";
		Pattern p = Pattern.compile(regx);
		Matcher m = p.matcher(json);
		List<String> strs = new LinkedList<>();
		while (m.find()) {
			strs.add(m.group(0));
		}
		// 使用 Stream API 进行处理并返回。
		return strs.stream().map(s -> s.substring(12, s.length() - 2)).collect(Collectors.toList());
	}
	public void download(List<String> urlList) {
		// 用于统计一些数据
		AtomicInteger successCount = new AtomicInteger(0), failCount = new AtomicInteger(0),
				exceptionCount = new AtomicInteger(0);
		// 设置超时时间
		RequestConfig config = RequestConfig.custom().setSocketTimeout(10 * 1000).setConnectTimeout(10 * 1000)
				.setConnectionRequestTimeout(10 * 1000).setRedirectsEnabled(false) // 不允许自动重定向,否则会把html页面当成图片下载下来
				.build();
		try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
			urlList.forEach(url -> {
				HttpGet getMethod = new HttpGet(url);
				try (CloseableHttpResponse response = httpClient.execute(getMethod)) {
					int statusCode = response.getStatusLine().getStatusCode();
					if (statusCode == HttpStatus.SC_OK) {
						HttpEntity entity = response.getEntity();
						if (entity != null) {
							String filename = this.getFileName(url);
							File file = new File("F:/baiduImage/" + filename);
							if (!file.exists()) {
								file.getParentFile().mkdirs();
							}
							try (OutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
								entity.writeTo(out);
								successCount.getAndIncrement();
								System.out.println(statusCode + " success: " + url + "\n" + filename);
							}
						}
					} else {
						failCount.getAndIncrement();
						System.out.println(statusCode + " fail: " + url);
					}
				} catch (IOException e) {
					e.printStackTrace();
					exceptionCount.getAndIncrement();
					System.out.println("IOException: " + url);
				}
			});
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		System.out.println("statistic data[ " + "Success: " + successCount.get() + "\n" + "Fail: " + failCount.get()
				+ "\n" + "Exception: " + exceptionCount.get() + " ]");
	}

	private String getFileName(String url) {
		String suffix = url.substring(url.lastIndexOf("/") + 1);
		if (suffix.contains("?")) {
			suffix = suffix.split("[?]")[0]; // 这个 ? ,不能直接使用,必须转义一下
		}
		// 后缀默认就是 jpeg
		suffix = -1 != suffix.lastIndexOf(".") ? suffix.substring(suffix.lastIndexOf(".")) : ".jpeg";
		return UUID.randomUUID().toString() + suffix;
	}
	public static void setHeaders(HttpGet get) {
		get.setHeader("Accept",				"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
		get.setHeader("Accept-Encoding", "gzip, deflate, br");
		get.setHeader("Cache-Control", "max-age=0");
		get.setHeader("Connection", "keep-alive");
		get.setHeader("Cookie","自己登录的cookie信息");// **自己登录的cookie信息**
		get.setHeader("Host", "image.baidu.com");
		get.setHeader("Upgrade-Insecure-Requests", "1");
		get.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
	}
}

编写main方法获取图片

public static void main(String[] args) throws Exception {
		PicSpider spider = new PicSpider();
		List<String> urls=spider.crawlePicture( "高清美景", 5);
		download(urls);
	}

跑起来在F:/baiduImage/文件夹可以找到下载的图片;
仅供学习使用

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:41:17  更:2022-03-10 22:43:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:07:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码