网页爬虫抓取百度图片(记录一下本次代码的坑点代码实现架构(图))

优采云 发布时间: 2021-12-02 15:09

  网页爬虫抓取百度图片(记录一下本次代码的坑点代码实现架构(图))

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

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

  实现架构

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

  

  我们来看看main方法:

  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重写的,结果还是报错。最后,使用超时设置。如果在该时间段内没有进行URL请求,则进行下一个URL请求,直接放弃该请求。本来打算爬600张图片,最后只能爬500张,原因就在这里。

  源码链接

  使用多线程抓取百度图片

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线