Java做爬虫也很方便
首先我们封装一个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, "抓取完成");
}
});
}
}

输入地址,点击提取按钮即可下载图片。
Java做爬虫也很方便的更多相关文章
- java网络爬虫基础学习(一)
刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...
- 学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- Java网络爬虫笔记
Java网络爬虫笔记 HttpClient来代替浏览器发起请求. select找到的是元素,也就是elements,你想要获取具体某一个属性的值,还是要用attr("")方法.标签 ...
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- 【转】44款Java 网络爬虫开源软件
原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...
- 用HttpClient和用HttpURLConnection做爬虫发现爬取的代码少了的问题
最近在学习用java来做爬虫但是发现不管用那种方式都是爬取的代码比网页的源码少了很多在网上查了很多都说是inputStream的缓冲区太小而爬取的网页太大导致读取出来的网页代码不完整,但是后面发现并不 ...
- Java基础-爬虫实战之爬去校花网网站内容
Java基础-爬虫实战之爬去校花网网站内容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 爬虫这个实现点我压根就没有把它当做重点,也没打算做网络爬虫工程师,说起爬虫我更喜欢用Pyt ...
- java做web项目比较多
WEB就是轻量级:如果要炫,FLEX或即将普及的html5.0都能做到像C/S那样. java做web项目比较多:如果是桌面程序,还是走C/S比较成熟. 如果是B/S架构的,后台还是JAVA,前台可以 ...
- 【转】Java做服务器开发语言
版权声明:本文为博主原创文章,未经博主允许不得转载. 随着游戏市场的兴起,特别是网页游戏.手机游戏的崛起,对游戏开发技术的需求越来越多.网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端.客户端 ...
随机推荐
- 2017年3月14日-----------乱码新手自学.net 之Authorize特性与Forms身份验证(登陆验证、授权小实例)
有段时间没写博客了,最近工作比较忙,能敲代码的时间也不多. 我一直有一个想法,想给单位免费做点小软件,一切思路都想好了,但是卡在一个非常基础的问题上:登陆与授权. 为此,我看了很多关于微软提供的Ide ...
- 用TextWriterTraceListener实现建议log文件记录
log4net之类3方组件确实很方便,但是想写个小小的demo之类的程序,有点用不起啊. 微软自带的TraceListener要实现一个简易的日志帮助类还是很简单的,直接上代码,自己备用,也希望对同样 ...
- 在CentOS7上源码安装php7--Install php7 from source on CentOS7
首先下载php源码包并解压: # wget http://cn2.php.net/get/php-7.0.9.tar.gz/from/this/mirror # .tar.gz # cd php- 然 ...
- Mysql有什么办法批量去掉某个字段字符中的空格
Mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数. ...
- Collection-Iterator-foreach
一.Collection(java.util) 1.概述:具有相同性质的一类事物的汇聚的整体,称为集合.任何集合都包含三块内容:对外的接口/接口的实现/对集合运算的算法. java中使 ...
- ios 12 xcode10 新升级的编译报错libstdc++.6.0.9 Multiple commands produce
问题一 编译报错 Showing Recent Messages :-1: Multiple commands produce '/Users/duning/Library/Developer/Xco ...
- iOS Automated Tests with UIAutomation
参照:http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation#1 UI Automation JavaScri ...
- jsoup获取网页属性
package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...
- acdream 小晴天老师系列——我有一个数列! (ST算法)
小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)S ...
- hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数. 思路:数据较多,处理会很慢.对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数 ...