论坛首页 Java企业应用论坛

论坛图片爬虫的一种实现

浏览 8036 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-14   最后修改:2011-05-18

 

1背景

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

 

2目标

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

 

3整体流程图

 

 

 4,使用到的工具和软件

VisualSVN ServerWindows 下的SVN服务,使用非常简单和傻瓜,windows下个人开发强力推荐。更多可参考:http://www.jb51.net/article/17365.htm 

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的方式调用迅雷,就可以实现视频的自动下载,不过现在暂时没有这个需求。

  • 大小: 46.1 KB
   发表时间:2011-05-17  
不错!
有想法就好......
0 请登录后投票
   发表时间:2011-05-18  
我也写过从论坛爬图片的网站,不过是从XX网站,为了避过眼花瞭乱的广告。
不过就没有像lz这样,把经验心得都写出来了,我的上不了台面呀。
0 请登录后投票
   发表时间:2011-05-18  
这个,对于常上的网站一般的浏览器都会有图片缓存吧? 另外,一次性把大量的图片都加载说明这个网站也有问题吧,不都是lazy load么? 即到了显示的时候再加载
0 请登录后投票
   发表时间:2011-05-19  
melanlife 写道
这个,对于常上的网站一般的浏览器都会有图片缓存吧? 另外,一次性把大量的图片都加载说明这个网站也有问题吧,不都是lazy load么? 即到了显示的时候再加载


浏览器缓存是对已经访问过的内容,和我这边的需求不太一样;网站确实没有作延时加载,不过由于图片较多,每张200k,50张的话就是10M,即使作延时加载也会因为网速的问题打开网页很慢。所以我作了这么个小工具,在网络空闲的时候,就把图片下载到本地,看起来就很方便了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics