![搜索引擎技术与发展](https://wfqqreader-1252317822.image.myqcloud.com/cover/53/35011053/b_35011053.jpg)
2.2 数据存储
爬虫抓取的结构化数据可以写入逗号分隔值(CSV)文件或数据库中。
如果需要写入多个不同的存储库,则可以让Gradle项目有多个可运行的任务。例如,在build.gradle文件中设置一个JavaExec类型的任务,然后运行newsCrawler.News2Solr类中的main()方法:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_71_2.jpg?sign=1739479895-5yUteQi7TlpTa1QGpeWdXMf6BJlxtNeH-0-0dfb312116bffb93a948f1c1887ad5df)
可以使用如下命令运行runSolr任务:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_71_3.jpg?sign=1739479895-j918V6lM9VwQUDMlkc1G8y9wgOp9egOo-0-55790a164efbd31d6f63b7be3f4b30a2)
2.2.1 写入文件
CSV只是一个普通的纯文本文件,逐列存储数据,并用分隔符分隔(如通常使用逗号“,”作为分隔符)。
工具包Apache Commons IO中包含一些用于文件操作的类,这里介绍使用Commons IO生成CSV文件。为了使用Apache Commons IO,可以在build.gradle文件中增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_1.jpg?sign=1739479895-GJZ0eSOEa1nVkmDZXfZIs5ynQRuZhN09-0-e94ca4842fc1c907d3a1bb963eeb0426)
将FileUtils.write()方法写入文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_2.jpg?sign=1739479895-4U2mdPjYWisXbTkJeS6dOL1MS267GMDS-0-917f2ceb57825367ea330720ba35ef41)
要搜索数据库中的文本,首先要规划索引的存储方式,建立索引列的字段,考察数据来源,建立从数据库中的表到索引列之间的转换关系。然后将数据库中的更新增量同步到索引库。
2.2.2 Jdbi写入数据库
在Java中,可以通过Jdbi访问关系型数据库。下面以SQLite数据库为例演示Jdbi写入数据库。在build.gradle文件中增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_3.jpg?sign=1739479895-tb8MexgKAkpc9WNSX66632MjFqGj160x-0-7a05ccb175e85fe748fe14f31fd1049a)
建立数据库连接:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_1.jpg?sign=1739479895-ftnH21pxjswgCdBXl4H0slZVzbeE7s0e-0-1128af4d8f806024f43a815e788fde7f)
写入数据:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_2.jpg?sign=1739479895-yenczRqelg5b0QHx221jtrwyoFGQJFOH-0-e2ae673bc459d1de413d9942461269c3)
为了加快写入速度,可以使用数据库连接池重用数据库连接,下面使用HikariCP数据库连接池增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_3.jpg?sign=1739479895-VKafGxO4W51q3PNsEOW5vOVuT74APSEs-0-b03540e335e55b9fa61b05f4858969e3)
使用HikariConfig类和HikariDataSource的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_4.jpg?sign=1739479895-JV723dAy61y2vDpWBVajFXH3j32MNiE5-0-c64d816dadfc5e6fd5069348a69c3856)
或者根据属性文件创建HikariConfig对象:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_1.jpg?sign=1739479895-XysDfg5Ki2zQMJ0oAEkEcYkhykYPjfOi-0-c6d98905805cafe421db6188f9ac80c1)
属性文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_2.jpg?sign=1739479895-ReDKW2rHNDHKa545JtGXaovd99b4hPDq-0-ef4822e1e00286ecc00560e5962d0a76)
可以在Spring Boot中使用HikariCP数据库连接池,Spring Boot 2默认的连接池就是HikariCP。在application.properties文件中配置的HikariCP如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_3.jpg?sign=1739479895-ekJ36mvF1oaIJ73PTVl0RO9QQ3CuafyK-0-a165ffeb9e74714bdbfdef91654be05a)
可以把SQLite中的数据导入MariaDB,根据指定表导出SQL文件:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_4.jpg?sign=1739479895-juaRK9SFvtX9E49WBVl2C2Fp975hS50N-0-fdfee39cd587ff2b35443fc3d58c79a0)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_75_1.jpg?sign=1739479895-nNCcHXnZr6eavL84qVpRHegYXgs7jVSz-0-f4fc124f944b4a0d2c46d82a877d531a)