java小爬虫
爬取煎蛋网
1、找出页面网址的规律
2、设计页面图片网址的正则
代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class SpiderTest { private static ArrayList<String> urlStrs = new ArrayList<String>();
private static String regx = "\"[\\S]*\\.(jpg|gif)"; //读取jpg和gif图片的正则
private static int num = 0; //图片名递增量 public static void main(String[] args)throws Exception{
//String urlStr = "http://jandan.net/ooxx/page-2381#comments"; //要抓取的煎蛋妹子网页示例
String urlStr="";
String dstDir = "d:/dstDir";
int start = 2340; //起始页
int end = 2370; //结束页 for(int i=start;i<=end;i++){
urlStr = "http://jandan.net/ooxx/page-"+i+"#comments";
matchAll(urlStr);
if(urlStrs.size() > 0){
for(String imgStr:urlStrs){
downFile(imgStr,dstDir);
Thread.sleep(300); //休息一会
}
}
urlStrs.clear();
}
System.out.println("网址抓取完毕");
}
/*
* @param:urlStr 要爬取的网址
*/
private static void matchAll(String urlStr)throws Exception{
Pattern p = Pattern.compile(regx);
Matcher m;
URL url;
try {
url = new URL(urlStr);
} catch (MalformedURLException e) {
throw new Exception("网址不存在");
} BufferedReader read= new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
while((line = read.readLine()) != null){
m = p.matcher(line);
while(m.find()){
System.out.println(m.group());
urlStrs.add("http:"+m.group().substring(1)); //将图片网址添加到ArrayList(过滤第一个双引号)
}
}
read.close();
}
/*下载指定图片网址的图片
* @param:urlStr 图片网址
* @param:dstDir 图片存放目录
*/
private static void downFile(String urlStr,String dstDir)throws Exception{
byte[] bBuf = new byte[1024];
File dir = new File(dstDir);
String fileName = "";
if(!dir.exists()){
dir.mkdir();
}
if(urlStr.endsWith("jpg")){
fileName = (num++) + ".jpg";
}else if(urlStr.endsWith("gif")){
fileName = (num++) + ".gif";
}
File imgFile = new File(dstDir,fileName);
//if(imgFile.exists()){
// TODO..
//}
URL url = new URL(urlStr);
BufferedInputStream in = new BufferedInputStream(url.openStream());
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(imgFile)); System.out.println("开始下载。。");
int len = 0;
while((len = in.read(bBuf)) != -1){
out.write(bBuf,0,len);
}
System.out.println("下载完毕");
in.close();
out.close();
}
/*
* 获取网页源码(此方法没有使用)
*/
private void getSourceCode(String u)throws Exception{
//String u = "http://m.onepiece.cc/post/10001/";
File f = new File("d:/tmp.txt");
if(!f.exists()){
f.createNewFile();
}
URL url = new URL(u);
BufferedReader read = new BufferedReader(new InputStreamReader(url.openStream()));
BufferedWriter write = new BufferedWriter(new FileWriter(f));
String s = "";
while((s=read.readLine()) != null){
write.write(s);
write.write('\n');
}
System.out.println("拷贝完成");
read.close();
write.close();
}
}

java小爬虫的更多相关文章
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- Java豆瓣电影爬虫——小爬虫成长记(附源码)
以前也用过爬虫,比如使用nutch爬取指定种子,基于爬到的数据做搜索,还大致看过一些源码.当然,nutch对于爬虫考虑的是十分全面和细致的.每当看到屏幕上唰唰过去的爬取到的网页信息以及处理信息的时候, ...
- node.js 开发简易的小爬虫
node.js 开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...
- JAVA小项目实例源码—学习娱乐小助手
代码地址如下:http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或爬 ...
- 学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- Java 网络爬虫,就是这么的简单
这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑 ...
- Java 多线程爬虫及分布式爬虫架构探索
这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...
- 放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~)
放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wa ...
- 放养的小爬虫--京东定向爬虫(AJAX获取价格数据)
放养的小爬虫--京东定向爬虫(AJAX获取价格数据) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wang/Sp ...
随机推荐
- mac、linux 查看端口占用程序
lsof -i:80 列出占用 80 端口的程序 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 672 ruby 42u IPv4 ...
- 【题解】【雅礼集训 2017 Day5】远行 LOJ 6038 LCT
Prelude 快要THUWC了,练一练板子. 传送到LOJ:o(TヘTo) Solution 首先有一条定理. 到树中任意一点的最远点一定是直径的两个端点之一. 我也不会证反正大家都在用,似乎可以用 ...
- Javascript 浮点计算问题分析与解决
分析 JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的. 浮点数的精度问题不是JavaScript特有的,因为有些小数 ...
- C语言第九节进制
进制 什么是进制 是一种计数的方式,数值的表示形式 数一下方块的个数 汉字:十一 十进制:11 二进制:1011 八进制:13 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个整数,我们至 ...
- CentOS6.5本地yum源配置
1. 建立本地源目录及挂载临时目录 2. 挂载光盘 3. 进入/etc/yum.repos.d/目录,将 CentOS-Base.repo CentOS-Debuginfo.repo CentOS-V ...
- 如何创建一个 Lua 模块
如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...
- js截取字符串substr和substring的区别
定义substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符.substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法substr() str ...
- linux scp上传文件到其他机器上
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- phpunit安装出错的原因及解决办法
官方指引 很遗憾, phpunit还没有在ArchLinux的仓库里. 所以使用下载安装的方式.按照官方的指引: wget https://phar.phpunit.de/phpunit.phar c ...
- 【leetcode 简单】 第九十五题 数字转换为十六进制数
给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...