![搜索引擎技术与发展](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=1739598327-i6fPNDRb26ptAKd2pqbXez6hnqZhrgOv-0-b2dbbe5fa3886191e9462a6e09031c11)
可以使用如下命令运行runSolr任务:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_71_3.jpg?sign=1739598327-oWdC4ONpyJZTV84qPzara69kD9yH6Fde-0-f83974c2b06f1389a8aafb524a7d39fe)
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=1739598327-ERqxBM3QdaWqpmRaxtPT1za7n21ah3rZ-0-09f2c225a31fe5011ebfd547f16873d1)
将FileUtils.write()方法写入文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_2.jpg?sign=1739598327-FvXH6QGuOoy7gcRJTaXa2Z1a2RQCUB2i-0-973fa8a7074ccbf5818ed0222d246e35)
要搜索数据库中的文本,首先要规划索引的存储方式,建立索引列的字段,考察数据来源,建立从数据库中的表到索引列之间的转换关系。然后将数据库中的更新增量同步到索引库。
2.2.2 Jdbi写入数据库
在Java中,可以通过Jdbi访问关系型数据库。下面以SQLite数据库为例演示Jdbi写入数据库。在build.gradle文件中增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_72_3.jpg?sign=1739598327-Uze2H1Sac09w01VNTPcqzUcRcIVGpIKF-0-f47e363dbe6899db50d88e50c645d1ab)
建立数据库连接:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_1.jpg?sign=1739598327-0Th5SrYCzk52ySemqkokaIsPUJ2Ef322-0-3568c601f7d929617dd5809b9cbd620e)
写入数据:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_2.jpg?sign=1739598327-7HmcRpEn07vCG3h04YpJ2HeqqKaVP5p5-0-72e7ec032fe31a6f716e8f384b953b71)
为了加快写入速度,可以使用数据库连接池重用数据库连接,下面使用HikariCP数据库连接池增加如下依赖项:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_3.jpg?sign=1739598327-4ggyRtY7YSCS6gQeXt9jESQCc3g95yBu-0-d4fd2af79708aceb5420692b02e207bf)
使用HikariConfig类和HikariDataSource的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_73_4.jpg?sign=1739598327-PeeQcune0ntZHb1SoLtsfEVQe6LvHOng-0-d4aa64224b1b573fd4612885137d3e77)
或者根据属性文件创建HikariConfig对象:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_1.jpg?sign=1739598327-GvuAQp1cKb25n9crlF3AiHL0739omIFL-0-b4a9770b12608b91c8f562c548f4a078)
属性文件的示例如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_2.jpg?sign=1739598327-MlG2zViWD0A2Z65qGBByqqgeJhAP2KkT-0-9924597e8bc65dd4120fed4e2d278dad)
可以在Spring Boot中使用HikariCP数据库连接池,Spring Boot 2默认的连接池就是HikariCP。在application.properties文件中配置的HikariCP如下:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_3.jpg?sign=1739598327-tEHfKFrd6bS3OVRRcq2JUmTNHutPDoac-0-84b787178983e574c53621d76cfd5aeb)
可以把SQLite中的数据导入MariaDB,根据指定表导出SQL文件:
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_74_4.jpg?sign=1739598327-xZ7nkSouYNVeqC9O1zYeC6KKzrXHkHf7-0-cac61d02028a7bce4598ddc88dd9e0ac)
![](https://epubservercos.yuewen.com/50C77E/18685354608165406/epubprivate/OEBPS/Images/39803_75_1.jpg?sign=1739598327-KM60kNWkMtMgKTtYg5dhEDM6VmK46O4K-0-36c37e922d3e545edf691467cf55de03)