本文主要介绍如何使用爬虫Crawler原理抓取网页图片,代码示例以Java编写,虽然存在一些bug,但对于基本的图片抓取功能已经足够。 在Web开发和数据分析领域,爬虫(Crawler)是一种常用的技术,用于自动化地从互联网上抓取大量信息。对于图片抓取,爬虫可以遍历网页源代码,找到图片URL,并将这些图片下载到本地。这里提到的代码片段是一个简单的Java爬虫实现,主要关注从网页抓取图片的功能。 首先,导入了必要的Java库,如`java.io`、`java.net`和`java.util`,这些库提供了文件操作、网络连接和集合类等功能。在代码中,`UrlToImage`类是核心类,它包含了一些关键方法,如`makeHtml`和`downloadImage`。 `makeHtml`方法用于创建HTML文件,它可以接收一个网页URL和目标文件路径作为参数,目的是生成一个包含网页图片链接的HTML文件。这个方法首先会检查并创建目标目录,然后调用另一个版本的`makeHtml`方法,该方法接受字符集参数,以确保正确解析网页内容。 `downloadImage`方法是实际下载图片的部分。它会连接到指定的URL,获取HTTP响应,然后读取响应的输入流来保存图片到本地。在这个过程中,使用了`HttpURLConnection`和`URLConnection`来建立网络连接,`InputStream`和`OutputStream`进行数据传输,`BufferedInputStream`和`BufferedOutputStream`提高读写效率。此外,`list`列表用于存储待下载的图片URL。 虽然代码存在一些未解决的bug,但基本思路清晰:通过解析HTML,提取出图片URL,然后逐个下载。这种方法适用于像"http://image.baidu.com"这样的网站,其中图片URL可以直接从HTML中找到。然而,对于使用JavaScript动态加载图片或者反爬虫策略的网站,这种方法可能不够有效。 在实际应用中,更完整的爬虫系统可能需要考虑以下几点: 1. **错误处理**:添加异常处理机制,对网络连接失败或文件读写错误进行适当处理。 2. **并发处理**:使用多线程或异步IO来提高下载速度。 3. **cookies和session管理**:对于需要登录的网站,可能需要模拟用户登录状态。 4. **代理IP**:使用代理服务器防止被目标网站封禁。 5. **延迟和随机等待**:避免过于频繁的请求导致服务器压力过大。 6. **反反爬虫策略**:如设置User-Agent、遵循robots.txt规则、模拟浏览器行为等。 7. **图片质量与格式识别**:识别和处理不同格式的图片,如JPEG、PNG等,并保证下载的图片质量。 基于爬虫Crawler原理抓取网页图片涉及网络编程、HTML解析和文件操作等多个方面。这个简化的Java实现提供了一个基础框架,但为了应对更复杂的场景,需要进一步完善和优化。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 看了有些图片很漂亮 表情很好玩的情况下 突然想写个抓图的程序
*
* @author monkey
* @email 450416064@qq.com
*/
public class UrlToImage {
final static Object lock = new Object();
static List<String> list = new ArrayList<String>();
File f = new File(filePath.substring(0, filePath.indexOf("\\html\\")
+ "\\html\\".length()));
if (!f.exists())
f.mkdirs();
makeHtml(page, filePath, "UTF-8");
}
public static void makeHtml(String page, String filePath, String chartset) {
synchronized (lock) {
BufferedReader br = null;
BufferedWriter bw = null;
URLConnection conn;
try{
URL url = new URL(page);
conn = url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT;DigExt)");
//输出流
InputStream str = conn.getInputStream();
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), chartset));
br = new BufferedReader(new InputStreamReader(str, chartset));
String line;
while ((line = br.readLine()) != null) {
if (line.trim().length() > 0) {
bw.write(line);
bw.newLine();
}
剩余9页未读,继续阅读
- 粉丝: 54
- 资源: 71
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展