![搜索引擎技术与发展](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=1739698223-nBIBt9J103erX8udGICzPnsi6YXBuZlx-0-854825c4bf8155bdb6ffba22ce67875c)
可以使用如下命令运行runSolr任务:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_71_3.jpg?sign=1739698223-W3UkfISJJsUNsd9nmonq6mtMqDqyWSHe-0-1bd8cbccc3adb4f34ef19006c9bf9574)
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=1739698223-HMGIIrhkJJuwzBEXWU6G2ykEbfWqw0S3-0-f60a0bba6494bfdbfd00a2bdf4164f53)
将FileUtils.write()方法写入文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_2.jpg?sign=1739698223-KrryHnAUWiUMCzCqcNIciniwV6KbrQC8-0-6fd091a310548c99511dd137748a1671)
要搜索数据库中的文本,首先要规划索引的存储方式,建立索引列的字段,考察数据来源,建立从数据库中的表到索引列之间的转换关系。然后将数据库中的更新增量同步到索引库。
2.2.2 Jdbi写入数据库
在Java中,可以通过Jdbi访问关系型数据库。下面以SQLite数据库为例演示Jdbi写入数据库。在build.gradle文件中增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_3.jpg?sign=1739698223-oFeBaCWo3USWd3aND2y49xYnknxm5nPa-0-c0428d8e573cfb6307aa3db6921353d6)
建立数据库连接:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_1.jpg?sign=1739698223-JiXAfDjcmj4qAI3nizLvpNuEkc55CceX-0-e550e74b150803f766c8d0d9ed42c4d7)
写入数据:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_2.jpg?sign=1739698223-spBKU4wQ7Keb1ADeu8S3kGIVOQO7JiLd-0-2e4300181e51c96ec471a54d67140b85)
为了加快写入速度,可以使用数据库连接池重用数据库连接,下面使用HikariCP数据库连接池增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_3.jpg?sign=1739698223-aZ3HjdIC5vakEHV6EwXEuPbwVAxq6LR3-0-c3bb9ff654742d3092025c22dd3df449)
使用HikariConfig类和HikariDataSource的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_4.jpg?sign=1739698223-9U9JmTervyF9rPPLWrPDKMisbwjaJOgJ-0-7eb86f98d98630808a2bef20b8ef51d3)
或者根据属性文件创建HikariConfig对象:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_1.jpg?sign=1739698223-SGvQO2NWOsvNfNoYJmDSxTrHsYFNw3rU-0-03198b075967de92c3c518ea32853128)
属性文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_2.jpg?sign=1739698223-kx4mZkTuI1AtvIjiZDY6EhUnI3pXbIWS-0-4c092c71ba4ddaa0092faf784a588adf)
可以在Spring Boot中使用HikariCP数据库连接池,Spring Boot 2默认的连接池就是HikariCP。在application.properties文件中配置的HikariCP如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_3.jpg?sign=1739698223-llk5AiD5uIkV0XICqiM5DoDWEt5Q48xM-0-84dc4e3e7e9325394e20e94a5cc2e5cd)
可以把SQLite中的数据导入MariaDB,根据指定表导出SQL文件:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_4.jpg?sign=1739698223-WXmb4Vyvjqrd2oyPvpwvl51zjMnFZzMc-0-710d2da6c7050c847d1a292aa3ec364b)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_75_1.jpg?sign=1739698223-0GOfn4IgMyAvD2lISjVn0yyijoe0CCtt-0-ca69ae1f7fef8769151f7e55d2caaab3)