Java网络爬虫(八)--使用多线程进行百度图片的抓取
来源:互联网 发布:淘宝买被子好吗 编辑:程序博客网 时间:2024/06/06 03:29
声明:如需转载本篇文章,请进行私聊并在文章首处注明出处,本代码未经授权不可用于获取商业价值,否则后果将由自己承担。
这次的需求大概是从百度图片里面抓取任意的分类的图片,考虑到有些图片的资源不是很好,并且由于百度搜索越到后面相关度会越来越低,所以我将每个分类要爬的数据量控制在了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张,原因就是在这。
源码链接
使用多线程进行百度图片的抓取
阅读全文
3 0
- Java网络爬虫(八)--使用多线程进行百度图片的抓取
- java爬虫抓取网络上的图片
- python爬虫(抓取百度图片)
- python网络爬虫(1)--抓取图片
- java爬虫实战简单用Jsoup框架进行网页爬虫(如抓取网页图片)
- WebCollector2.X 网络JAVA爬虫入门(抓取百度百科)
- 基于Java的网络爬虫实现抓取网络小说(一)
- python网络爬虫抓取图片
- 网络爬虫:抓取页面图片
- python 网络爬虫抓取图片
- python网络爬虫抓取图片
- python网络爬虫抓取图片
- Jsoup 爬虫 抓取网络图片
- 网络爬虫:抓取XXOO图片
- python网络爬虫抓取图片
- 利用爬虫抓取百度贴吧的图片
- python爬虫抓取多关键词搜索的百度图片
- 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用
- 机器学习笔记3-id3算法决策树程序解析
- 编译错误总结
- 记忆化搜索之一: hihoCoder 1491 : Monster Killing
- Mybatis多表关联查询的实现(DEMO)
- java的局部类和匿名类
- Java网络爬虫(八)--使用多线程进行百度图片的抓取
- Unity/Animation -- 创建Animation Clip
- 通过DiskLruCache以及LruCache来构建自己项目的图片缓存框架
- Android Studio Java文件和Kotlin文件的转换
- 172.n1-使用sharedpreference将读取的新闻标记为灰色
- 数据结构之排序算法
- ThreadLocal的使用
- LeetCode 34. Search for a Range
- Remove Element