来自:猿天地

首先我们封装一个Http请求的工具类,用HttpURLConnection实现,当然你也可以用HttpClient, 或者直接用Jsoup来请求(下面会讲到Jsoup)。

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

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
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 void main(String[] args) {String url = "https://www.toutiao.com/a6568327638044115460/";String html = HttpUtils.get(url);List imgUrls = getImageSrc(html);for (String imgSrc : imgUrls) {System.out.println(imgSrc);}}public static List getImageSrc(String html) {// 获取img标签正则String IMGURL_REG = "]*?>";// 获取src路径的正则String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);List 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;}

首先将网页的内容抓取下来,然后用正则的方式解析出网页的标签,再解析img的地址。执行程序我们可以得到下面的内容:

http://p9.pstatp.com/large/pgc-image/1529307883634343f939c85
http://p1.pstatp.com/large/pgc-image/1529307883606177aaf408b
http://p3.pstatp.com/large/pgc-image/152930788361571655944eb
http://p1.pstatp.com/large/pgc-image/1529307883500ad4375beb0
http://p3.pstatp.com/large/pgc-image/1529307883536bc68e6156e

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

public static void main(String[] args) throws MalformedURLException, IOException {String url = "https://www.toutiao.com/a6568327638044115460/";String html = HttpUtils.get(url);List imgUrls = getImageSrc(html);for (String imgSrc : imgUrls) {Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));}
}

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

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

添加jsoup的依赖:

org.jsoupjsoup1.11.3

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

public static void main(String[] args) throws MalformedURLException, IOException {String url = "https://www.toutiao.com/a6568327638044115460/";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;}Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));}}

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

Jsoup使用起来非常简单,当然还有很多其他解析网页的操作,大家可以去看看资料学习一下。

下面我们再来升级一下,做成一个小工具,提供一个简单的界面,输入一个网页地址,点击提取按钮,然后把图片自动下载下来,我们可以用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() {@Overridepublic void actionPerformed(ActionEvent e) {String url = jTextField.getText();if (url == null || url.equals("")) {JOptionPane.showMessageDialog(null, "请填写抓取地址");return;}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 {Files.copy(new URL(imgSrc).openStream(), Paths.get("./img/"+UUID.randomUUID()+".png"));} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}}JOptionPane.showMessageDialog(null, "抓取完成");}});}
}

执行main方法首先出来的就是我们的界面了,如下:

屏幕快照 2018-06-18 09.50.34 PM.png

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

Java做爬虫也很牛相关推荐

  1. 用Java做爬虫爬取王者荣耀的英雄头像

    大家好,今天我和大家分享一下用Java做爬虫爬取王者荣耀的英雄头像. 首先我们需要王者荣耀的网址,然后获取连接,通过IO读取网页的源代码,用正则表达式筛选我们需要的代码,在每个筛选对象(图片的地址)前 ...

  2. java做爬虫解决521错误

    欢迎访问github 最近做爬虫时碰到了521错误,500开头的都是服务器错误,521错误有很大可能是请求头参数不对,比如下面这个 这是错误的 这是正确的 就是这一堆东西可能有哪些少了或是错误,而在爬 ...

  3. Java 未死,依然很牛逼!

    很多文章都在说 Java 快被取代了,其实不然,现在 Java 还是未来主导编程语言,依然很牛逼. 今天给大家带来一套珍贵的 Java 电子书,非常全面,包括 Java 语言基础.多线程并发编程.JV ...

  4. 为什么爬虫用python不用java_为什么常用Python,Java做爬虫,而不是C#C++等

    我用c#,java都写过爬虫.区别不大,原理就是利用好正则表达式.只不过是平台问题.后来了解到很多爬虫都是用python写的.因为目前对python并不熟,所以也不知道这是为什么.百度了下结果: 1) ...

  5. java做爬虫和python做爬虫_为什么常用Python,Java做爬虫,而不是C#C++等?

    我写了爬虫在c#和java.区别不大,原则是充分利用正则表达式.这只是一个平台的问题.后来我才知道,许多爬虫是用python编写的.因为我不熟悉python目前,我不知道为什么.百度给了以下结果:1) ...

  6. 靖哥哥教你如何用java做爬虫抓取网站美女图片(详解步骤)

    原文 https://www.jggbk.com/blogs/article/258.html

  7. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  8. Java网页爬虫--基于URLConnection的网页爬虫工具类

    在这个数据为王的时代,爬虫应用地越来越广泛,对于一个萌新程序员来说如果你要做爬虫,那么Python是你的不二之选.但是对于那些老腊肉的Java程序员(亦或者你是程序媛)想使用Java做爬虫也不是不行, ...

  9. 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源 | https://jitwxs.cn/a64edcb ...

最新文章

  1. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异
  2. 【 C 】assert.h 简明介绍
  3. Ubuntu开发Java教程_Ubuntu下Java环境的搭建基础教程
  4. UVa11300 Spreading the Wealth(数学问题)
  5. jQuery的HTML与CSS方法
  6. ABAP EXCEL 上传 和下载 过程
  7. WebStorm调试Electron
  8. docker安装到指定目录_Docker常用命令总结
  9. 《浅谈架构之路:前后端分离模式》 - 山人行 - 博客园
  10. labelme2coco问题:TypeError: Object of type 'int64' is not JSON serializable
  11. 【渝粤教育】电大中专Office办公软件 (2)作业 题库
  12. sdn框架的计算机网络管理,清华SDN实践--SDN 系统架构与数据中心应用
  13. 企业级整站集群数据备份项目方案详解
  14. Python以字符形式打印双色图片中的文字
  15. Linux目录/usr/bin和 /usr/local/bin区别
  16. c语言程序设计辅导资料pdf,C语言程序设计辅导资料(修订版).pdf
  17. 君莫笑:小白的堆(bai_dui)
  18. 计算机知识产权有哪些,计算机类专利有哪些可以申请
  19. python3-xlsx表格文件读取
  20. 资产监测设备中二极管单向性和三相电电流流向问题

热门文章

  1. HDU1083(二分图-匈牙利算法)
  2. (每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)
  3. luogu P2865 [USACO06NOV]Roadblocks G(次短路模板)
  4. 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐
  5. 【题解】P1508 Likecloud-吃、吃、吃(简单DP)
  6. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果
  7. 计算机网络应用基础 王建珍,计算机网络应用基础
  8. jop怎么读音英语怎么说_“秀恩爱”英语怎么说?可不是“show love”
  9. poj3683(2-SAT)
  10. 非计算机专业毕业论文用游戏,计算机专业大学生毕业论文