首先我们封装一个Http请求的工具类,用HttpURLConnection实现,也可以用HttpClient, 或者直接用Jsoup来请求。

工具类实现比较简单,就一个get方法,读取请求地址的响应内容,这边我们用来抓取网页的内容,没有使用代理,在真正的抓取过程中,当你大量请求某个网站的时候,对方会有一系列的策略来禁用你的请求,这个时候代理就排上用场了,通过代理设置不同的IP来抓取数据。

public class HttpUtils {

    public static String get(String url) {
try {
URL getUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "*/*");
connection.setRequestProperty(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA)");
connection.setRequestProperty("Accept-Language", "zh-cn");
connection.connect(); BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"));
String line;
StringBuffer result = new StringBuffer();
while ((line = reader.readLine()) != null){
result.append(line);
} reader.close();
return result.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

接下来我们随便找一个有图片的网页,来试试抓取功能

public static List<String> getImageSrc(String html) {
// 获取img标签正则
String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
// 获取src路径的正则
String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";
Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);
List<String> listImgUrl = new ArrayList<>();
while (matcher.find()) {
Matcher m = Pattern.compile(IMGSRC_REG).matcher(matcher.group());
while (m.find()) {
listImgUrl.add(m.group().substring(0, m.group().length() - 1));
}
}
return listImgUrl;
} public static void main(String[] args) {
String url = "http://coder520.com/";
String html = HttpUtils.get(url);
List<String> imgUrls = getImageSrc(html);
for (String imgSrc : imgUrls) {
System.out.println(imgSrc);
}
}

首先将网页的内容抓取下来,然后用正则的方式解析出网页的标签,再解析img的地址。

执行程序我们可以得到下面的内容:

http://ophdr3ukd.bkt.clouddn.com/logo.png
http://ophdr3ukd.bkt.clouddn.com/SSM.jpg
http://ophdr3ukd.bkt.clouddn.com/%E5%8D%95%E8%BD%A6.jpg

通过上面的地址我们就可以将图片下载到本地了,下面我们写个图片下载的方法:

public static void main(String[] args) throws IOException {
String url = "http://coder520.com/";
String html = HttpUtils.get(url);
List<String> imgUrls = getImageSrc(html); File dir = new File("img");
if (!dir.exists()) {
dir.mkdir();
} for (String imgSrc : imgUrls) {
System.out.println(imgSrc);
String fileName = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
Files.copy(new URL(imgSrc).openStream(), Paths.get("img/" + fileName));
}
}

运行程序图片就被下载下来了


这样就很简单的实现了一个抓取并且提取图片的功能了,看起来还是比较麻烦哈,要写正则之类的 ,下面给大家介绍一种更简单的方式,如果你熟悉jQuery的话对提取元素就很简单了,这个框架就是Jsoup。

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

添加jsoup的依赖:

        <dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>

使用jsoup之后提取的代码只需要简单的几行即可:

public static void main(String[] args) throws IOException {
// String url = "http://coder520.com/";
// String html = HttpUtils.get(url);
// List<String> imgUrls = getImageSrc(html);
//
// File dir = new File("img");
// if (!dir.exists()) {
// dir.mkdir();
// }
//
// for (String imgSrc : imgUrls) {
// System.out.println(imgSrc);
// String fileName = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
// Files.copy(new URL(imgSrc).openStream(), Paths.get("img/" + fileName));
// } String url = "http://coder520.com/";
String html = HttpUtils.get(url); File dir = new File("img");
if (!dir.exists()) {
dir.mkdir();
} Document doc = Jsoup.parse(html);
// 提取img标签
Elements imgs = doc.getElementsByTag("img");
for (Element img : imgs) {
// 提取img标签的src属性
String imgSrc = img.attr("src");
if (imgSrc.startsWith("//")) {
imgSrc = "http:" + imgSrc;
}
System.out.println(imgSrc);
String fileName = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
Files.copy(new URL(imgSrc).openStream(), Paths.get("img/" + fileName));
}
}

通过Jsoup.parse创建一个文档对象,然后通过getElementsByTag的方法提取出所有的图片标签,循环遍历,通过attr方法获取图片的src属性,然后下载图片。

下面我们再来升级一下,做成一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后把图片自动下载下来,我们可以用swing写界面。

public class App {

    public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setResizable(false);
frame.setSize(425,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.setLocationRelativeTo(null);
JTextField jTextField = new JTextField();
jTextField.setBounds(100, 44, 200, 30);
frame.add(jTextField);
JButton jButton = new JButton("提取");
jButton.setBounds(140, 144, 100, 30);
frame.add(jButton);
frame.setVisible(true);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String url = jTextField.getText();
if (url == null || url.equals("")) {
JOptionPane.showMessageDialog(null, "请填写抓取地址");
return;
} File dir = new File("img");
if (!dir.exists()) {
dir.mkdir();
} String html = HttpUtils.get(url);
Document doc = Jsoup.parse(html);
Elements imgs = doc.getElementsByTag("img");
for (Element img : imgs) {
String imgSrc = img.attr("src");
if (imgSrc.startsWith("//")) {
imgSrc = "http:" + imgSrc;
}
try {
System.out.println(imgSrc);
String fileName = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
Files.copy(new URL(imgSrc).openStream(), Paths.get("img/" + fileName));
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
JOptionPane.showMessageDialog(null, "抓取完成");
}
});
} }

输入地址,点击提取按钮即可下载图片。

最新文章

  1. poj1698--最大流(Dinic)
  2. Java学习笔记(04)
  3. PHPExcel中文开发手册翻译版(2)
  4. 关于php留言本网站的搭建
  5. ajax500错误
  6. MVC4 使用概述
  7. Logistic Regression逻辑回归
  8. centos安装软件Error: Cannot find a valid baseurl for repo: base
  9. Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别
  10. Java 中的泛型详解-Java编程思想
  11. asp.net 读取Excel文档
  12. 宣布正式发布 Windows Azure 多重身份验证
  13. 201521123080《Java程序设计》第4周学习总结
  14. qt中moc的作用
  15. IO (二)
  16. Sql Server 2008日志满的解决办法
  17. 20175320 2018-2019-2 《Java程序设计》第6周学习总结
  18. 绝版珍珍藏:web前端技术学习指南
  19. beta版说明书
  20. SHA1WithRSA签名 规范化标准签名

热门文章

  1. MyBatis关联查询、多条件查询
  2. JFinal视频教程
  3. HoloLens | 世界的每一次变化,其实都提前打好了招呼
  4. Python+selenium之疑难点解决之去除readonly的限制
  5. jsp另外五大内置对象之-exception
  6. ueditor1_3_6 一点问题记录
  7. Android(java)学习笔记123:Android MediaPlayer 播放prepareAsync called in state 8解决办法
  8. groff - groff 文档排版系统前端
  9. 使用EventLog组件保存Windows系统日志
  10. oracle 数据导到 sql server