网络爬虫:抓取页面图片
2015-03-05 11:56
369 查看
爬虫就是根据页面的url来抓取页面的一些信息也就是页面的html代码,抓到后可以根据正则去匹配想要的片段,比如想要某一个页面中的一个图片,那么这个图片一定有自己的URL地址,可以正则匹配到这个url 在进行图片下载,也有很多人先写正则,根据正则的规则抓取页面的信息,当然这都是一种方式,根据业务需求去量身定做就好了,其实这两种方式各有好处,第一中适用于页面不会变化的,在代码里面写正则还是容易很多,第二种适用于页面经常改变的那么将正则放到数据库里面就可以了,以后页面变了直接改数据库而不是去该代码还要重新启动服务对吧!下面我举个小例子吧
第一步:要有一个工具类,可以根据给定的URL地址去链接页面,在读取页面中的信息,当然java的.net包早已经提供了这种功能(也可以用更好的HttpClient)
就抓取搜库排行榜的 神雕侠侣的详情页吧 地址:rul=http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3
/**
*
* @author 奇
*
* 2015-3-5
*/
public class ReptileUtil {
public static String getHtmlData(String path) { //传入的页面地址 url
StringBuffer sb = new StringBuffer();
try {
URL url = new URL(path);
BufferedReader br = new BufferedReader(new InputStreamReader(
url.openStream(), Charset.forName("GBK")));//编码格式根据页面去定
String s = null;
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString(); //返回页面的html 信息
}
//根据给定的图片rul地址抓取图片并且下载到指定路径下
public File downLoadImage(String url) {
String fileName = getUUID()+"_default."+"jpg"; //图片名称又uuid和字符串拼接而成 后缀默认是jpg的图片格式
File file=null;
byte[] btImg = getImageFromNetByUrl(url); //调用下面的方法返回读取的字节
if (null != btImg && btImg.length > 0) {
file= writeImageToDisk(btImg, fileName);
}
return file;
}
public static byte[] getImageFromNetByUrl(String strUrl) {
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
public static File writeImageToDisk(byte[] img, String fileName) {
File file = new File(TennisConfig.FILE_TEMP_PATH + fileName);//指定文件要下载的 位置 这里用配置文件读取了,可以自己定义
try {
FileOutputStream fops = new FileOutputStream(file);
fops.write(img);
fops.flush();
fops.close();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
public static String getUUID() {//获取一个不从复的数来设置文件名,当然也可以用日期看自己喜好
String s = UUID.randomUUID().toString();
// 去掉“-”符号
return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18)
+ s.substring(19, 23) + s.substring(24);
}
}
好了一个工具类已经完成包括从一个页面读取页面信息的方法和根据图片地址下载图片的方法都已经完成
public class grab{
/ /根据页面html的格式找到图片所在的div 写正则 匹配出图片的rul地址 如下:
private static final String filepath = "<div\\s*?class=\"box-img\">\\s*?<a\\s*?target=\"_blank\"\\s*?href=\".*?\">\\s*?<img\\s*?src=\"(.*?)\"\\s*?/>\\s*?</a>\\s*?</div>";
public static void main(String[] args) {
String html = ReptileUtil.getHtmlData("http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3");
//获取页面信息
String standardPic=simplex(html, filepath); //通过正则 匹配到图片的url地址
//将图片地址交给工具类下载
ReptileUtil rep = new ReptileUtil();
File file= rep.downLoadImage(standardPic) //将图片下载到指定的文件路径下返回file 可以继续进行操作 不过该功能已经结束了
System.out.println(file.getName());
}
//封装的正则匹配方法用java的Pattern
public String simplex(String html, String script) {
Pattern p = Pattern.compile(script);
Matcher matcher = p.matcher(html);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
}
上述功能只能是获取图片,当然也可以获取导演、演员、只要页面有的都可以根据页面的html格式来设计正则匹配就好了
今天元宵节 祝元宵快乐
第一步:要有一个工具类,可以根据给定的URL地址去链接页面,在读取页面中的信息,当然java的.net包早已经提供了这种功能(也可以用更好的HttpClient)
就抓取搜库排行榜的 神雕侠侣的详情页吧 地址:rul=http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3
/**
*
* @author 奇
*
* 2015-3-5
*/
public class ReptileUtil {
public static String getHtmlData(String path) { //传入的页面地址 url
StringBuffer sb = new StringBuffer();
try {
URL url = new URL(path);
BufferedReader br = new BufferedReader(new InputStreamReader(
url.openStream(), Charset.forName("GBK")));//编码格式根据页面去定
String s = null;
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString(); //返回页面的html 信息
}
//根据给定的图片rul地址抓取图片并且下载到指定路径下
public File downLoadImage(String url) {
String fileName = getUUID()+"_default."+"jpg"; //图片名称又uuid和字符串拼接而成 后缀默认是jpg的图片格式
File file=null;
byte[] btImg = getImageFromNetByUrl(url); //调用下面的方法返回读取的字节
if (null != btImg && btImg.length > 0) {
file= writeImageToDisk(btImg, fileName);
}
return file;
}
public static byte[] getImageFromNetByUrl(String strUrl) {
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
public static File writeImageToDisk(byte[] img, String fileName) {
File file = new File(TennisConfig.FILE_TEMP_PATH + fileName);//指定文件要下载的 位置 这里用配置文件读取了,可以自己定义
try {
FileOutputStream fops = new FileOutputStream(file);
fops.write(img);
fops.flush();
fops.close();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
public static String getUUID() {//获取一个不从复的数来设置文件名,当然也可以用日期看自己喜好
String s = UUID.randomUUID().toString();
// 去掉“-”符号
return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18)
+ s.substring(19, 23) + s.substring(24);
}
}
好了一个工具类已经完成包括从一个页面读取页面信息的方法和根据图片地址下载图片的方法都已经完成
public class grab{
/ /根据页面html的格式找到图片所在的div 写正则 匹配出图片的rul地址 如下:
private static final String filepath = "<div\\s*?class=\"box-img\">\\s*?<a\\s*?target=\"_blank\"\\s*?href=\".*?\">\\s*?<img\\s*?src=\"(.*?)\"\\s*?/>\\s*?</a>\\s*?</div>";
public static void main(String[] args) {
String html = ReptileUtil.getHtmlData("http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3");
//获取页面信息
String standardPic=simplex(html, filepath); //通过正则 匹配到图片的url地址
//将图片地址交给工具类下载
ReptileUtil rep = new ReptileUtil();
File file= rep.downLoadImage(standardPic) //将图片下载到指定的文件路径下返回file 可以继续进行操作 不过该功能已经结束了
System.out.println(file.getName());
}
//封装的正则匹配方法用java的Pattern
public String simplex(String html, String script) {
Pattern p = Pattern.compile(script);
Matcher matcher = p.matcher(html);
if (matcher.find()) {
return matcher.group(1);
}
return "";
}
}
上述功能只能是获取图片,当然也可以获取导演、演员、只要页面有的都可以根据页面的html格式来设计正则匹配就好了
今天元宵节 祝元宵快乐
相关文章推荐
- 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用
- 网络爬虫初步:从一个入口链接开始不断抓取页面中的网址并入库
- 基于python的网络爬虫---抓取p站图片
- java网络爬虫——下载页面图片
- 第二个python爬虫 多页面抓取美女图片
- python 网络爬虫抓取图片
- 【Python爬虫基础】抓取知乎页面所有图片
- 爬虫案例---Python2X版本抓取京东手机页面的图片
- Jsoup 爬虫 抓取网络图片
- 蜘蛛爬虫网络高像素图片抓取工具[搜索引擎]
- 蜘蛛爬虫网络高像素图片抓取工具[ZSpider.NET]
- 蜘蛛爬虫网络高像素图片抓取工具[ZSpider.NET]
- 网络爬虫抓取页面的一种存储方法
- 网络爬虫,获取页面图片
- 网络爬虫初步:从一个入口链接开始不断抓取页面中的网址并入库
- Python3 网络爬虫之抓取图片
- 一个简单的python爬虫,抓取单个页面的图片
- Python爬虫--抓取单一页面上的图片文件学习
- android适用爬虫抓取网络图片s