网页爬虫抓取百度图片(记录一下本次代码的坑点代码实现架构(图))
优采云 发布时间: 2022-01-15 08:19网页爬虫抓取百度图片(记录一下本次代码的坑点代码实现架构(图))
免责声明:如需转载本文文章,请私聊并在文章开头注明出处。本代码未经授权不得用于获取商业价值,否则后果自负。
这次的需求大概是从百度图片中抓取任意类别的图片。考虑到有些图片的资源不是很好,而且因为百度搜索越远,相关性就会越来越低,所以我将每个类别的数据量都控制在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张,原因是这样的。
来源链接
使用多线程抓取百度图片