利用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”);

}

}

“`

在启动爬虫之后,可以通过控制台输出来查看爬取到的数据。

六、


数据运维技术 » 利用WebMagic实现数据爬虫并保存到数据库 (webmagic 保存到数据库)