陆陆续续折腾一周的网站上线了,地址在这里 http://itblog.enilu.cn
这个网站主要汇聚了一些优秀的IT类博客的文章索引,用户在这里就可以看到全网很多大牛和牛X团队的技术博客,可谓干货满满。
针对这个网站的实现过程,分为8篇文章分别说明:
0.手把手写个爬取IT博客的网站-提纲
1.手把手写个爬取IT博客的网站-需求分析
2.手把手写个爬取IT博客的网站-技术选型
3.手把手写个爬取IT博客的网站-框架搭建
4.手把手写个爬取IT博客的网站-数据采集
5.手把手写个爬取IT博客的网站-数据展示
6.手把手写个爬取IT博客的网站-域名申请和服务器采购
7.手把手写个爬取IT博客的网站-系统上线
8.手把手写个爬取IT博客的网站-网站优化
本篇为本系列文章的第二篇:手把手写个爬取IT博客的网站-框架搭建
项目框架搭建的基本过程其实就是一个最基础的spring boot项目的启动过程,网上有非常多的资料,这里这是简单将项目搭建的关键过程描述下。
新建项目
使用idea新建一个maven工程,pom.xml中引入核心依赖:
<!-- spring boot start-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.jpa.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- sqlite start -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.3.Final</version>
</dependency>
<dependency>
<groupId>com.enigmabridge</groupId>
<artifactId>hibernate4-sqlite-dialect</artifactId>
<version>0.1.2</version>
</dependency>
<!-- ehcache-->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>${ehcache.core.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
<version>${lombok.version}</version>
</dependency>
<!--jsoup html parser-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.1</version>
</dependency>
<!-- baidu api-->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.4.1</version>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>${spring.boot.version}</version>
</dependency>
如之前技术选型中所说:
- 数据库采用sqlite,故引入sqlite依赖
- 数据采集使用jsoup,所以引入jsoup依赖
- 另外使用百度的自然语言处理api来对文章做自动分类和标签化,所以引入百度api
核心配置
server.port=8081
#模版热部署
spring.thymeleaf.cache=false
spring.thymeleaf.mode=LEGACYHTML5
#数据库配置
spring.jpa.show-sql=true
spring.jpa.database-platform=com.enigmabridge.hibernate.dialect.SQLiteDialect
spring.jpa.generate-ddl=true
sqlite.url=jdbc:sqlite:/data/website/blog.db
#百度自然语言处理api调用参数
api.baidu.nlp.app.id=myAppid
api.baidu.nlp.app.key=myAppkey
api.baidu.nlp.secret.key=myKey
sqlite数据库配置
数据库采用sqlite,需要配置其数据源
@Configuration
public class DataSourceConfiguration
{
@Value("${sqlite.url}")
private String sqliteUrl;
@Bean(destroyMethod = "", name = "EmbeddeddataSource")
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.sqlite.JDBC");
dataSourceBuilder.url(sqliteUrl);
dataSourceBuilder.type(SQLiteDataSource.class);
return dataSourceBuilder.build();
}
}
定时采集数据任务配置
- 启动主类Application 中增加注解:@EnableScheduling
- 添加定时任务类
@Component
public class ScheduledCollect {
private Logger logger = LoggerFactory.getLogger(ScheduledCollect.class);
@Autowired
CollectorRepository collectorRepository;
@Autowired
private ApplicationContext applicationContext;
/**
* 每天夜里23点采集数据
**/
@Scheduled(cron="0 0 23 * * ?")
public void collect() {
List<Collector> collectors = collectorRepository.findAllByState(true);
for(Collector collector :collectors){
AbstractCollect collect = (AbstractCollect) applicationContext.getBean(collector.getClassName());
logger.info("采集:{}",collector.getAuthor());
collect.collect();
}
}
}
利用百度自然语言处理api对文章进行分类和打标签
虽然抓取的主要是IT博客,但是不排除有的博客会发布一些非技术文章,针对这些非技术文章可以用上述api做分类。 这里推荐百度自然语言处理apihttps://ai.baidu.com/docs#/NLP-API/3e14446d,其他大厂如腾讯等也有类似的api,没有一一了解,用哪个纯粹看心情。 百度的这些api没有调用量限制,只有QPS限制(不能超过5),基本是可以满足我的需求的。 具体使用方法百度有非常全面的文档,这里不再赘述。
上面为项目主体的关键配置和代码 剩下的就是实现各个模块:数据库层、采集层,页面等内容,不一一赘述