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

为朋友的网站写了个小代码,把所有图片下载到本地,有点不道德了,哈哈。。。

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();
}
}

}
}

早先年,驰骋网络,积累了很多源代码…… 互联网的基因、骨头里就是自由、分享,非常感谢没有墙的时代,无限怀念,想想当时的BBS,俱往矣~ 如今的互联网却在疯狂的过滤、筛选、删除,有了N多的墙…… 不知道说什么好,很多的资源因为商业利益的原因从如今臭名昭著的搜索引擎被删除,恐怕是很担忧后起之秀…… 遗憾的是互联网不但是必须自由的,而且是创新的天地,前辈们结实的臂膀就是无私奉献给后来者攀登的,而决不是扼杀…… 最近看到网络上的商业争吵,很是气愤~!!! 于是就开始重新注意网络蜘蛛…… 很难过,网络上已经很难找到免费的、有价值的蜘蛛代码~ 每一个程序人(包括国外的)如果没有demo,又从何入手??? 可笑的人,可笑的世界,一个自由的网络被勒上了无形的缰绳,网络上哪些免费的、有价值的资源正被搜索引擎“淡”化,包括谷沟(早先一睹古够地图后就下了结论:互联网摧毁一切!),不是吗?看看全世界的墙,从太极看:物极必反,自由的极端就是地狱、牢笼……任何东西都有互反的作用,美味的食物都带“毒”,但人们选择容忍、忽略,存在有不用付出代价的东西吗?! 我翻出我的布袋,把它们依然放回它们应该呆的地方,让更多的人们得到启发,开始创新之旅,期待您的精彩,感谢曾经自由的(不被看重)网络~~~ ------------------------------- 这个是完整的项目源代码,原汁原味,无需多舌~ 搞程序,必须e文过关,自己琢磨去吧~ 我们记住一点: 互联网上流转的都是数字,那些非数字的东西只是方便更多人使用,网络上“散布”的什么反向搜索等等只是一种愚笨的方法而已,实际上蜘蛛是根本不需要DNS、注册机构什么劳什子的,它只需要不知疲倦地啃噬不同国家地区的IP,并不是所有的IP都注册、登记哦~ 把不“规则”的物料抓回来,接着才是反向等方式的数据整理,蜘蛛织网、缝补都是需要时间积累的,这些原始的东西才是人们真正感兴趣的东西,“归置、加工”后只是一种规则下的苟且或商业的需要罢了…… 所以这个蜘蛛只需要你给(小小更动)它喂食(IP库)~ 它就会不知疲劳地四处爬,抓回的东西…… 怎么组织数据(库)才是搜索引擎的关键~!!! 抓回来就看你怎么折腾、运作了,可以肯定的是: 互联网需要的就是千奇百怪的、五花八门的搜索引擎~!!! 目前的数量远远不够,远远不够,这将是它的魅力,需要大家的智慧和义务劳动,在摧毁一切之前我们尽心营造和谐,呵呵~ ===================================== 忘记了…… 再来说下用途: 比如你在某网站,看到想看的图片,但要注册什么的看不到,还有其它资源~ 怎么办呢? 就用蜘蛛吧,把地址准确输入,它就会自动给你爬出来…… 可以设定要抓取的文件类型,…… 比如图片什么的,征婚网站有很多mm图片,就是看不到,怎么办? 用爬虫吧,当然爬虫只能爬所有http资源,数据库的就得用另法了,呵呵~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值