利用WebMagic实现数据爬虫并保存到数据库 (webmagic 保存到数据库)
随着互联网的高速发展,数据量越来越庞大,传统的手动采集数据已经无法满足需求,因此,数据爬虫成为了一种重要的自动化采集数据工具。而WebMagic是一款开源的Java爬虫框架,拥有强大的爬取、解析和存储功能。本文将介绍如何的具体实现方式。
一、概述
WebMagic是一款功能强大的Java爬虫框架,它提供了强大的爬取、解析和存储功能,可以方便地进行数据采集、数据清洗和数据分析。WebMagic采用了面向对象的编程思想,提供了方便的API和灵活的扩展机制,使得爬虫的编写变得更加简单和快速。同时,WebMagic支持多线程、分布式部署和大规模数据处理,可以满足各种不同的需求。
二、准备工作
在编写爬虫之前,需要进行一些准备工作:
1. 相应的开发环境
WebMagic是一个基于Java的爬虫框架,因此需要安装Java环境。此外,还需要安装Maven管理工具。具体安装方法可以参考官方文档。
2. 确定数据来源
在进行数据采集之前,需要确定所需数据的来源。可以在浏览器中打开相应的网页,通过查看源代码获得所需数据所在的位置和格式。
3. 选择适当的数据库
爬取到的数据需要进行存储,因此需要选择适当的数据库。WebMagic支持多种数据库的操作,比如MySQL、Oracle、MongoDB等。
4. 导入所需的依赖包
在编写爬虫代码时,需要使用一些开源的库,比如Jsoup、HttpClient等。这些库可以通过Maven进行管理,需要在pom.xml文件中添加相应的依赖包。
三、编写爬虫代码
在进行了上述准备工作之后,就可以开始编写爬虫代码了。WebMagic提供了丰富的接口和方法,可以根据不同的需求进行自由组合。下面以一个简单的爬取豆瓣电影Top250的例子来介绍WebMagic的基本用法。
1.创建一个Java项目,并添加pom.xml文件
在刚创建的Java项目中,需要添加pom.xml文件,并导入相关的依赖包。
2.创建一个Spider类
在Java项目中创建一个Spider类,并继承自WebMagic中的Spider类。在Spider类中实现自己的业务逻辑。
“`java
public class MovieSpider extends Spider {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);
public MovieSpider() {
this.site = site;
}
public MovieSpider(Site site) {
this.site = site;
}
public void crawler(String url) {
this.addUrl(url)
.setScheduler(new QueueScheduler().setDuplicateRemover(new HashSetDuplicateRemover()))
.thread(5)
.addPipeline(new ConsolePipeline())
.run();
}
}
“`
在这个类中,我们创建了一个Site对象,用于设置爬虫的一些参数,比如重试次数、休眠时间、超时时间等。
3.解析网页
在Spider类中,我们需要实现process方法,用于解析网页。
“`java
@Override
public void process(Page page) {
List links = page.getHtml().links().regex(“https://movie.douban.com/top250\\?start=\\d+&filter=”).all();
page.addTargetRequests(links);
if (page.getUrl().regex(“https://movie\\.douban\\.com/subject/.*”).match()) {
String title = page.getHtml().xpath(“//*[@id=\”content\”]/h1/span[1]/text()”)
.replace(” “, “”)
.replace(“\n”, “”)
.get();
String rating = page.getHtml().xpath(“//*[@id=\”interest_sectl\”]/div[1]/div[2]/strong/text()”)
.get();
MovieInfo movieInfo = new MovieInfo();
movieInfo.setTitle(title);
movieInfo.setRating(rating);
page.putField(“movieInfo”, movieInfo);
} else {
page.setSkip(true);
}
}
“`
在这个方法中,我们使用了Page类提供的一些方法来对网页进行解析,比如getHtml、links、regex等。在获取到相应的数据之后,我们可以将其放在MovieInfo类中,并使用putField方法进行存储。同时,我们可以使用setSkip方法来控制是否需要对该网页进行存储。
4.存储数据
在Spider类中,我们需要使用Pipeline来存储数据。WebMagic提供了多种Pipeline的实现,比如ConsolePipeline、FilePipeline、JsonFilePipeline等。这里我们使用自定义的MySQLPipeline来将数据存储到MySQL数据库中。
“`java
public class MySQLPipeline implements Pipeline {
private final Logger logger = LoggerFactory.getLogger(getClass());
private String url = “jdbc:mysql://localhost:3306/movies?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8”;
private String username = “root”;
private String password = “123456”;
private String driverClassName = “com.mysql.cj.jdbc.Driver”;
private DataSource dataSource;
public MySQLPipeline() {
this.dataSource = getDataSource();
}
public MySQLPipeline(String url, String username, String password, String driverClassName) {
this.url = url;
this.username = username;
this.password = password;
this.driverClassName = driverClassName;
this.dataSource = getDataSource();
}
@Override
public void process(ResultItems resultItems, Task task) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = dataSource.getConnection();
String sql = “insert into movie_info(title, rating) values(?, ?)”;
preparedStatement = connection.prepareStatement(sql);
MovieInfo movieInfo = resultItems.get(“movieInfo”);
preparedStatement.setString(1, movieInfo.getTitle());
preparedStatement.setString(2, movieInfo.getRating());
preparedStatement.executeUpdate();
} catch (SQLException e) {
logger.error(“保存数据失败:”, e);
} finally {
close(connection, preparedStatement);
}
}
public void close(Connection connection, PreparedStatement preparedStatement) {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
logger.error(“释放资源失败:”, e);
}
}
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
}
“`
在这个类中,我们首先使用DataSource来获取数据库连接,然后在process方法中使用JDBC的方式将数据存储到数据库中。在获取到连接之后,我们需要编写相应的SQL语句,并使用preparedStatement对象将数据存储到数据库中。在释放资源之前,我们需要关闭连接和preparedStatement对象。
五、启动爬虫
在完成了Spider类的编写之后,我们就可以启动爬虫了。在mn方法中,我们创建一个Spider类实例,并调用crawler方法来启动爬虫。crawler方法需要传入一个url参数,用于指定爬虫的起始页面。
“`java
public class App {
public static void mn(String[] args) {
MovieSpider spider = new MovieSpider();
spider.crawler(“https://movie.douban.com/top250”);
}
}
“`
在启动爬虫之后,可以通过控制台输出来查看爬取到的数据。
六、