热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java图片爬虫_论坛图片爬虫的一种实现

1背景经常上贴图的论坛(Discuz!),每次打开帖子的时候,由于帖子的图片太多,每次都要等不少时间才能看到所有的图片,比较

1背景

经常上贴图的论坛(Discuz!),每次打开帖子的时候,由于帖子的图片太多,每次都要等不少时间才能看到所有的图片,比较麻烦;同时经常会打开看过的帖子。为了解决这个问题,写了个小爬虫,定期把最新的帖子中的图片下载到本地。

2目标

自动登录、智能发现为抓取的帖子、智能提取图片URL、多线程下载到本地。

3整体流程图

b0e837bcc2b66b6f857c3c8ca442ab3f.png

4,使用到的工具和软件

VisualSVN Server:Windows下的SVN服务,使用非常简单和傻瓜,windows下个人开发强力推荐。更多可参考:

Paros:web安全漏洞扫描工具。可拦截所有的HTTP的请求和相应。这里用来分析登录时提交的数据。

Firebug, mvn:这个不多说了,谁用谁知道。

5,使用到的框架

http client 4.1。 用来发起Http get和post请求。本来用的是3.1版本,结果多线程下载的时候,底层出现了线程死锁问题。看到官网也强力推荐升级,然后升级解决了这个问题。

6,关键代码和步骤

COOKIE的手动处理

httpclient没有自动把登录的COOKIE信息放到请求的消息头里,需要手工处理。

HttpGet httpget = new HttpGet(url);

if (isNeedLogin) {

httpget.setHeader("COOKIE", getCOOKIEString());

}

public static String getCOOKIEString() {

StringBuffer stringBuffer = new StringBuffer();

for (COOKIE item : logonCOOKIEs) {

stringBuffer.append(item.toString());

stringBuffer.append(";");

}

if (stringBuffer.length() > 1) {

return stringBuffer.substring(0, stringBuffer.length() - 1)

.toString();

}

return stringBuffer.toString();

}

Http client多线程设置:

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();

cm.setMaxTotal(50);

// 多线程的

httpClient = new DefaultHttpClient(cm);

图片下载代码:

/**

* 下载图片到本地

*

* @return 是否发生网络异常

*/

public static boolean downloadPic(String url, String path) {

// GetMethod get = new GetMethod(url);

HttpGet httpget = new HttpGet(url);

try {

HttpResponse resp = httpClient.execute(httpget);

File storeFile = new File(path);

// 得到网络资源的字节数组,并写入文件

FileOutputStream out = new FileOutputStream(storeFile);

InputStream in = resp.getEntity().getContent();

byte[] buffer = new byte[1024];

int count = -1;

while ((count = in.read(buffer)) != -1) {

out.write(buffer, 0, count);

}

out.flush();

out.close();

} catch (Exception e) {

log.error("线程" + Thread.currentThread().getName()

+ "号. 下载图片异常. URL为" + url, e);

return false;

}

return true;

}

mvn创建java工程的命令:

mvn archetype:create -DgroupId=com.mike -DartifactId=picgetter -DpackageName=org.mike

7,展望

BT视频的自动下载,最近迅雷开放了API,通过JNI的方式调用迅雷,就可以实现视频的自动下载,不过现在暂时没有这个需求。



推荐阅读
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
author-avatar
枫殇忆华年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有