java的爬虫应用教程,实战数据抓取与分析
随着互联网时代的到来,数据成为了企业和个人获取成功的一条必经之路,所以数据的重要性也越来越高。而爬虫技术作为数据获取的利器,在各行各业都得到了广泛的应用。本文将介绍如何使用Java语言编写爬虫,实现数据的抓取与分析。
一、前置知识
在学习Java爬虫之前,需要掌握以下几个基础知识:
- Java语言基础:至少需要了解Java中的类、方法、变量等基本概念,以及面向对象编程的思想。
- HTML基础:了解HTML语言基本结构和标签,可以使用简单的CSS样式和JavaScript代码。
- HTTP基础:了解HTTP协议中GET和POST方法的基本原理,对Cookie、User-Agent等HTTP头部信息有一定的了解。
- 正则表达式:了解正则表达式的基本语法和使用方法。
- 数据库操作:掌握Java数据库操作基本知识,例如JDBC、Hibernate、MyBatis等。
二、Java爬虫基础
爬虫(web crawler)是一种自动化程序,可以模拟人的行为访问互联网,从网页中提取信息并进行处理。Java语言具有良好的网络编程能力和强大的面向对象特性,因此很适合编写爬虫程序。
Java爬虫一般分为三个部分:URL管理器、网页下载器和网页解析器。
- URL管理器
URL管理器管理爬虫需要爬取的URL地址,并记录哪些URL已经爬取过了,哪些URL还需要被爬取。URL管理器一般有两种实现方式:
(1)内存式URL管理器:使用一个Set或Queue来记录已经爬取的URL和待爬取的URL。
(2)数据库式URL管理器:将已经爬取和待爬取的URL存储在数据库中。
- 网页下载器
网页下载器是爬虫的核心部分,负责从互联网中下载网页。Java爬虫一般有两种实现方式:
(1)URLConnection:使用URLConnection类实现,使用起来比较简单,核心代码如下:
1 2 3 4 5 6 7 8 9 | URL url = new URL( "http://www.example.com" ); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream in = conn.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String line = reader.readLine(); while (line != null ) { System.out.println(line); line = reader.readLine(); } |
(2)HttpClient:使用HttpClient框架实现,相对于URLConnection更加强大,可以处理Cookie、自定义User-Agent等HTTP头部信息,核心代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod( "http://www.example.com" ); int status = httpClient.executeMethod(getMethod); if (status == HttpStatus.SC_OK) { InputStream in = getMethod.getResponseBodyAsStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String line = reader.readLine(); while (line != null ) { System.out.println(line); line = reader.readLine(); } } |
- 网页解析器
网页下载下来之后,需要用网页解析器将其中的数据提取出来。Java爬虫一般有两种实现方式:
(1)正则表达式:使用正则表达式匹配网页中的数据,核心代码如下:
1 2 3 4 5 6 | String pattern = "<title>(.*?)</title>" ; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(html); if (m.find()) { System.out.println(m.group( 1 )); } |
(2)HTML解析器:使用Jsoup框架实现,可以将网页转换为DOM结构,然后通过CSS选择器或者类似XPath的方式来获取数据,核心代码如下:
1 2 3 4 5 6 7 | Document doc = Jsoup.connect( "http://www.example.com" ).get(); Elements links = doc.select( "a[href]" ); for (Element link : links) { String text = link.text(); String href = link.attr( "href" ); System.out.println(text + " " + href); } |
三、Java爬虫实战
了解了Java爬虫的基本思路和实现方式之后,我们可以尝试编写一个简单的爬虫程序来获取某个网站的数据并进行分析。
- 爬取数据
我们选择爬取豆瓣电影排行榜的数据。首先,我们需要获取豆瓣电影排行榜的URL地址,如下所示:
1 | https: //movie.douban.com/chart |
然后,我们可以使用Jsoup框架来下载网页并提取其中的数据,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Document doc = Jsoup.connect( "https://movie.douban.com/chart" ).get(); Elements items = doc.select( "div.item" ); List<Movie> movieList = new ArrayList<>(); for (Element item : items) { Elements title = item.select( "div.info div.hd a" ); Elements rating = item.select( "div.info div.bd div.star span.rating_num" ); Elements director = item.select( "div.info div.bd p" ).eq( 0 ); Elements actor = item.select( "div.info div.bd p" ).eq( 1 ); Movie movie = new Movie(); movie.setTitle(title.text()); movie.setRating(Double.valueOf(rating.text())); movie.setDirector(director.text().replace( "导演: " , "" )); movie.setActor(actor.text().replace( "主演: " , "" )); movieList.add(movie); } |
这里我们使用了一个Movie类来存储电影的信息。
- 存储数据
将获取到的电影数据存储到数据库中,方便后续的分析。这里我们使用了JDBC来操作数据库,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class DBHelper { private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver" ; private static final String DB_URL = "jdbc:mysql://localhost:3306/db" ; private static final String USER = "root" ; private static final String PASS = "password" ; public static Connection getConnection() { Connection conn = null ; try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, USER, PASS); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void saveMovies(List<Movie> movieList) { try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement( "INSERT INTO movie(title,rating,director,actor) VALUES (?,?,?,?)" )) { for (Movie movie : movieList) { stmt.setString( 1 , movie.getTitle()); stmt.setDouble( 2 , movie.getRating()); stmt.setString( 3 , movie.getDirector()); stmt.setString( 4 , movie.getActor()); stmt.addBatch(); } stmt.executeBatch(); } catch (Exception e) { e.printStackTrace(); } } } |
- 分析数据
有了数据之后,我们就可以进行分析,这里我们统计一下每个导演的电影数量和平均评分。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class MovieAnalyzer { public static void analyzeMovies() { try (Connection conn = DBHelper.getConnection(); Statement stmt = conn.createStatement()) { String sql = "SELECT director, COUNT(*) AS cnt, AVG(rating) AS avg_rating " + "FROM movie " + "GROUP BY director " + "HAVING cnt > 1 " + "ORDER BY avg_rating DESC" ; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { String director = rs.getString( "director" ); int cnt = rs.getInt( "cnt" ); double avgRating = rs.getDouble( "avg_rating" ); System.out.printf( "%-20s %5d %7.2f%n" , director, cnt, avgRating); } } catch (Exception e) { e.printStackTrace(); } } } |
将获取到的电影信息存储到数据库中,并进行分析,我们就完成了Java爬虫的实战应用。
四、总结
本文介绍了Java爬虫的基础知识和实战应用,希望能够帮助读者更好地了解爬虫技术和Java编程。在实践中,需要注意法律和道德规范,不去非法获取他人隐私和侵犯版权等行为。同时,也需要掌握反爬虫技术,以免被被爬取网站屏蔽或封禁IP等。