`
wangshu3000
  • 浏览: 135743 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

[小代码]蜘蛛爬虫,抓取某网站所有图片文章中的图片~

阅读更多
为朋友的网站写了个小代码,把所有图片下载到本地,有点不道德了,哈哈。。。
package com.ai.picpicker;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.htmlparser.util.ParserException;

public class PicPicker {
	public static final String siteUrlPrefix = "http://www.****.com/a********";
	public static final String siteUrlSuffix = ".html";;
	public static final int pageNum = 4;// Sum 20 pages.
	public static final int startCategory = 1;

	public static void main(String args[]) throws ParserException, HttpException, IOException, InterruptedException {
		MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
		HttpClient httpClient = new HttpClient(connectionManager);

		int picCount = 0;
		// Main Loop, all page.
		PickerThread[] ppt = new PickerThread[pageNum];
		for (int p = 3; p < pageNum; p++) {
			ppt[p] = new PickerThread(httpClient, p + 1, startCategory);
			ppt[p].start();
			System.out.println("Thread " + (p + 1) + " Started~~");
			ppt[p].join();
		}
		for (int p = 3; p < pageNum; p++) {
			picCount = picCount + ppt[p].getCount();
		}
		System.out.println("All downloaded file num:" + picCount);
	}
}


package com.ai.picpicker;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.HeadingTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;

public class PickerThread extends Thread {

	private HttpClient httpClient = null;
	private int pageNum = 0;
	private int picCountT = 0;
	private int startCategory = 0;

	public PickerThread(HttpClient httpClient, int pageNum, int startCategory) {
		this.httpClient = httpClient;
		this.pageNum = pageNum;
		this.startCategory = startCategory - 1;
	}

	public int getCount() {
		return picCountT;
	}

	@Override
	public void run() {
		System.out.println("Thread " + pageNum + " Running~~");
		File forLogFile = new File("log4thread" + pageNum);
		FileWriter fwl = null;
		String picStr = null;
		try {
			Parser parser;
			parser = new Parser("http://www.******.com/a*******" + pageNum + ".html");
			fwl = new FileWriter(forLogFile);
			NodeList nodelist = parser.parse(null);
			NodeFilter categoryFilter = new TagNameFilter("h4");
			NodeList categoryList = nodelist.extractAllNodesThatMatch(categoryFilter, true);
			GetMethod getPageMethod = null;
			for (int i = startCategory; i < categoryList.size(); i++) {
				HeadingTag ht = (HeadingTag) categoryList.elementAt(i);
				LinkTag lt = (LinkTag) ht.getChild(0);
				String oneUrl = lt.getLink();
				fwl.write("[INFO]" + "Category Num" + i + " Downloading! Url:" + oneUrl + "\n");
				getPageMethod = new GetMethod(oneUrl);
				int statusCode = httpClient.executeMethod(getPageMethod);
				if (statusCode != HttpStatus.SC_OK) {
					fwl.write("[ERROR]" + "Method failed: " + getPageMethod.getStatusLine() + "\n");
				} else {
					fwl.write("[INFO]" + "Page" + pageNum + "_" + getPageMethod.getStatusLine() + "\n");
					fwl.flush();
					byte[] pageBody = getPageMethod.getResponseBody();
					getPageMethod.releaseConnection();
					String picListHtml = new String(pageBody, "UTF-8").trim();
					String picSubStr = picListHtml.substring(picListHtml.indexOf("start"), picListHtml.indexOf("end"));
					while (picSubStr.indexOf("\"file\"") != -1) {
						picStr = picSubStr.substring(picSubStr.indexOf("\"file\"") + 8, picSubStr.indexOf("\"pic\"") - 2).replace("\\",
								"");
						StringBuilder sb = new StringBuilder();
						sb.append("P").append(pageNum).append("_C").append(i + 1).append("/");
						File dir = new File(sb.toString());
						if (!dir.exists()) {
							dir.mkdir();
							dir = null;
						}
						sb.append(picStr.substring(picStr.indexOf("/", 16) + 1, picStr.length()));
						File picFile = new File(sb.toString());
						if (picFile.exists()) {
							fwl.write("[ERROR]" + "Duplication picture! FileName:" + sb.toString() + "\n");
							if (picSubStr.indexOf("\"pic\"", 7) != -1) {
								picSubStr = picSubStr.substring(picSubStr.indexOf("\"pic\"", 7) + 7, picSubStr.length());
							}
							continue;
						}
						GetMethod getPicMethod = new GetMethod("http://www.******.com/" + picStr);
						statusCode = httpClient.executeMethod(getPicMethod);
						if (statusCode != HttpStatus.SC_OK) {
							fwl.write("[ERROR]" + "Method failed: " + " URL:" + "http://www.********.com/" + picStr
									+ getPicMethod.getStatusLine() + "\n");
						} else {
							byte[] picBody = getPicMethod.getResponseBody();
							getPicMethod.releaseConnection();
							FileOutputStream picOutPut = new FileOutputStream(picFile);
							picOutPut.write(picBody);
							picOutPut.close();
							fwl.write("[INFO]" + "Pic" + picCountT++ + " URL:" + "http://www.*********.com/" + picStr + "\n");
							fwl.flush();
							System.out.print('.');
						}
						// System.out.println(picStr);
						if (picSubStr.indexOf("\"pic\"", 7) != -1) {
							picSubStr = picSubStr.substring(picSubStr.indexOf("\"pic\"", 7) + 7, picSubStr.length());
						}
					}
					fwl.write("[DEBUG]" + lt.getLink());
					fwl.flush();
				}
				System.out.println();
				fwl.flush();
			}
			fwl.write("[INFO]" + "Thread " + pageNum + " run over " + picCountT + "pic!!!\n");
			fwl.flush();
		} catch (Exception e) {
			System.out.println("Thread " + pageNum + " Exception!!! PicUrl:" + picStr);
			e.printStackTrace();
		} finally {
			try {
				if (fwl != null)
					fwl.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

2
6
分享到:
评论
2 楼 wangshu3000 2012-01-03  
greatghoul 写道
很不错,我也经常抓取些图片,当然都是**网站的,如果只是抓取图片,建议使用正则,会快很多。
还有这个run方法大了点儿,可以再分离下。。。

不好意思,完全没考虑设计, 就是实现功能,一次性的。呵呵。所以也不顾什么设计模式,什么代码结构了。实现功能就OK了。。
1 楼 greatghoul 2012-01-03  
很不错,我也经常抓取些图片,当然都是**网站的,如果只是抓取图片,建议使用正则,会快很多。
还有这个run方法大了点儿,可以再分离下。。。

相关推荐

    精华志 蜘蛛爬虫,递归抓取页面的URL 抓取页面URL

    本资源“精华志 蜘蛛爬虫,递归抓取页面的URL 抓取页面URL”显然是一个关于如何使用编程语言实现递归爬虫的教程,特别关注了C#、ASP.NET、SQL和DBA技术,并可能包含源码供学习和参考。 1. **C#**:C#是微软开发的一...

    PHP模拟baidu蜘蛛抓取网站链接

    在IT行业中,网络爬虫是一种常见的技术,用于自动化地抓取互联网上的信息。在这个场景中,我们关注的是如何使用PHP来模拟百度蜘蛛的行为,抓取指定网站的链接,并将这些链接保存到TXT文本中。这一过程涉及到多个PHP...

    网络蜘蛛-自动抓取网上图片

    在本场景中,网络蜘蛛的主要任务是抓取网上的图片。这个过程涉及到多个技术环节,包括网页解析、URL管理、图片下载以及可能的数据存储。 首先,**网页解析**是网络蜘蛛工作的核心部分。它通常使用HTML解析库,如...

    稀有的、完整的网络蜘蛛、爬虫源代码~~~!

    早先年,驰骋网络,积累了很多源代码…… 互联网的基因、骨头里就是自由、分享,非常感谢没有墙的时代,无限怀念,想想当时的BBS,俱往矣~ ...用爬虫吧,当然爬虫只能爬所有http资源,数据库中的就得用另法了,呵呵~

    蜘蛛爬虫实现jar包

    【标题】:“蜘蛛爬虫实现jar包”是指一个包含了实现蜘蛛爬虫功能的Java应用程序的归档文件。这种jar包通常由一系列类文件、资源文件和元数据组成,旨在帮助开发者抓取网页内容,处理URL,并可能用于搜索引擎的数据...

    C#爬虫蜘蛛程序(图片抓取).rar

    【标题】:“C#爬虫蜘蛛程序(图片抓取)” 这个标题揭示了一个基于C#编程语言编写的网络爬虫程序,它的主要功能是抓取互联网上的图片资源。爬虫,也被称为蜘蛛程序,是一种自动浏览和分析网页的软件工具。在IT领域...

    蜘蛛爬虫搜索引擎

    在互联网世界中,搜索引擎是获取信息的关键工具,而“蜘蛛爬虫”(也称为网络爬虫或网页爬虫)是搜索引擎背后的重要技术之一。它通过自动地遍历和抓取互联网上的网页,为搜索引擎提供丰富的数据来源,以便进行索引和...

    自写C#蜘蛛爬虫源代码

    【标题】"自写C#蜘蛛爬虫源代码"是一个基于C#编程语言实现的网络爬虫项目,专为Visual Studio 2013开发环境设计,并兼容.NET Framework 4.5。该项目提供了完整的源代码,包含详尽的注释和使用说明,旨在促进开发者...

    js跳转不影响蜘蛛抓取.rar

    在互联网世界中,搜索引擎的爬虫(也称为蜘蛛)对于网站的索引和排名起着至关重要的作用。当涉及到JS(JavaScript)跳转时,一个常见的担忧是这可能会影响搜索引擎的抓取,导致某些页面无法被正确索引。本文将深入...

    网站搜索引擎蜘蛛爬虫日志分析

    网站搜索引擎蜘蛛爬虫日志分析是一项关键的SEO(搜索引擎优化)技术,它涉及到对网站访问记录的深入理解和解析,以了解搜索引擎如何与你的网站互动。本文将深入探讨这个主题,帮助你理解爬虫的工作原理、如何分析...

    蜘蛛日志在线分析工具源码 快速分析搜索引擎网络爬虫抓取记录

    蜘蛛日志在线分析工具是一款开源的工具,可用于快速分析网站访问日志中搜索引擎网络爬虫的抓取记录。如果你的服务器运行在linux宝塔面板环境下,你只需要登录宝塔面板的linux控制面板,在左侧导航栏中点击”文件”,...

    IVBD『限制百度蜘蛛抓取txt代码』

    "IVBD『限制百度蜘蛛抓取txt代码』"这个主题涉及到如何通过编写`robots.txt`文件来管理搜索引擎爬虫的访问权限。`robots.txt`是一种简单的文本文件,它告诉搜索引擎哪些页面可以抓取,哪些应避免抓取。在这个场景中...

    蜘蛛爬虫源码分享

    在IT领域,蜘蛛爬虫是一种自动化程序,用于在网络上抓取信息。它们模拟了人类用户的行为,遍历网页并收集数据,这对于数据分析、搜索引擎优化(SEO)以及网站内容监控等应用至关重要。源码是指编程过程中编写的原始...

    c#蜘蛛、网络爬虫源代码

    标题中的“C#蜘蛛、网络爬虫源代码”是指使用C#编程语言编写的网络爬虫程序的源代码。网络爬虫,也称为网页抓取器或数据抓取工具,是一种自动化程序,它能遍历互联网上的网页,收集所需信息。在C#中实现爬虫,通常会...

    Java网络爬虫(蜘蛛)源码

    Java网络爬虫,也被称为“蜘蛛”,是一种自动化程序,用于从互联网上抓取大量信息。在Java编程语言中实现网络爬虫,可以利用其强大的面向对象特性、稳定性和跨平台能力,来高效地抓取、解析和存储网页数据。这款开源...

    蜘蛛抓取网页数据

    在标题提到的“蜘蛛抓取网页数据”中,我们主要关注的是使用编程语言,如C#,实现这一过程。.NET框架提供了一个强大的环境来构建这样的应用程序,而C#作为.NET平台的主要开发语言,拥有丰富的库和工具支持网页抓取。...

    网站日志蜘蛛在线分析工具源码 日志可视化管理 快速分析搜索引擎网络爬虫抓取记录

    网站日志蜘蛛在线分析工具源码 日志可视化管理工具源码 快速分析搜索引擎网络爬虫抓取记录 如果是 linux 宝塔面板 的服务器自然环境,大家登陆宝塔面板linux控制面板后,点一下左边“文件”,在www下的wwwlogs文件...

    C#蜘蛛爬虫源代码多线程

    在这个场景中,我们讨论的是使用C#实现的一个蜘蛛爬虫(Web Crawler)的源代码。蜘蛛爬虫是互联网上的一个自动化程序,用于抓取网页内容并进行索引,通常被搜索引擎用来更新其搜索结果。 在"Program.cs"这个文件中...

Global site tag (gtag.js) - Google Analytics