网页爬虫抓取百度图片(实现百度图片的实现架构(一)_架构_光明网)

优采云 发布时间: 2022-03-22 01:10

  网页爬虫抓取百度图片(实现百度图片的实现架构(一)_架构_光明网)

  免责声明:如需转载本文文章,请私聊并在文章开头注明出处。本代码未经授权不得用于获取商业价值,否则后果自负。

  这次的需求大概是从百度图片中抓取任意类别的图片。考虑到有些图片的资源不是很好,而且因为百度搜索越远,相关性就会越来越低,所以我将每个类别的数据量控制在600,实际爬下来,每个类别大约有500张图片。

  实现架构

  我们来看看这段代码的实现架构:

  

  我们来看看主要的方法:

  package mainmethon;

import httpbrowser.CreateUrl;

import savefile.ImageFile;

import java.util.ArrayList;

import java.util.List;

import static java.lang.System.out;

/**

* Created by hg_yi on 17-5-16.

*

* 测试数据:image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=bird&

*

* 在多线程进行下载时,需要向线程中传递参数,此时有三种方法,我选择的第一种,设计构造器

*/

public class major {

public static void main(String[] args) {

int sum = 0;

List urlMains = new ArrayList();

List imageUrls = new ArrayList();

//首先得到10个页面

urlMains = CreateUrl.CreateMainUrl();

out.println(urlMains.size());

for(String urlMain : urlMains) {

out.println(urlMain);

}

//使用Jsoup和FastJson解析出所有的图片源链接

imageUrls = CreateUrl.CreateImageUrl(urlMains);

for(String imageUrl : imageUrls) {

out.println(imageUrl);

}

//先创建出每个图片所属的文件夹

ImageFile.createDir();

int average = imageUrls.size()/10;

//对图片源链接进行下载(使用多线程进行下载)创建进程

for(int i = 0; i < 10; i++){

int begin = sum;

sum += average;

int last = sum;

Thread image = null;

if(i < 9) {

image = new Thread(new ImageFile(begin, last,

(ArrayList) imageUrls));

} else {

image = new Thread(new ImageFile(begin, imageUrls.size(),

(ArrayList) imageUrls));

}

image.start();

}

}

}

  main方法中各个方法的解释很清楚,这里就不详细解释了。

  记录这段代码的坑

  对于这段代码的实现,改bug时间最长的是这段代码:

  try {

URL url = new URL(imageUrls.get(i));

URLConnection conn = url.openConnection();

conn.setConnectTimeout(1000);

conn.setReadTimeout(5000);

conn.connect();

inputStream = conn.getInputStream();

} catch (Exception e) {

continue;

}

  这段代码的主要目的是下载图片,请求图片的源地址,然后将其作为输入流。在没有进行超时设置和异常处理之前,会出现链接超时和读取超时两个错误。,当时也用httpclient重写,结果还是不对。最后使用了timeout设置,如果超过时间后没有进行url请求,则进行下一个url请求,直接放弃请求。本来打算爬600张图,最后只能爬500张,原因是这样的。

  来源链接

  使用多线程抓取百度图片

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线