Java网络爬虫(八)--使用多线程进行百度图片的抓取

声明:如需转载本篇文章,请进行私聊并在文章首处注明出处,本代码未经授权不可用于获取商业价值,否则后果将由自己承担。

这次的需求大概是从百度图片里面抓取任意的分类的图片,考虑到有些图片的资源不是很好,并且由于百度搜索越到后面相关度会越来越低,所以我将每个分类要爬的数据量控制在了600,实际爬下来,每个分类也就是500左右的图片。


实现架构

先来看一下本次代码的实现架构:

这里写图片描述

  • htmlparse里面的两个类主要负责对网页进行请求以返回实体,并且对实体进行解析,拿到自己想要的json数据和每个图片的链接。
  • httpbrowser里面主要构建了要爬取的url,从百度图片的分页到具体的每个图片的url。
  • mainmethon主要就是main方法了。
  • savefile主要是将爬取的图片进行文件的保存,以每个图片的url最后面的一串字符串为文件名,然后将它保存到自己创建的目录之中。

我们来看一下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<String> urlMains = new ArrayList<>();
        List<String> 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<String>) imageUrls));
            } else {
                image = new Thread(new ImageFile(begin, imageUrls.size(),
                        (ArrayList<String>) 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;
}

这段代码的主要目的就是下载图片,对图片的源地址进行请求,然后将其作为输入流,在没有进行超时设定和异常处理之前,是会进行链接超时和read time out这两个错误的,当时还使用了httpclient进行了改写,结果还是不正确,最后使用了超时设定,并且对于超过时间还没有进行url请求的,就进行下一个url的请求,直接放弃这次请求,本来打算爬600张图片,最后只能爬500张,原因就是在这。


源码链接

使用多线程进行百度图片的抓取

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值