一、项目简介
其实使用Java开发一个爬虫项目并没有想象中那么难,流行的SpringBoot快速构建项目,还有现成的WebMagic之类的爬虫框架,实现简单的新闻爬虫项目还是很容易的。
由于想要做一些热点分析的项目,写了个新闻爬虫项目。由于我需要的是历史的新闻数据,对实时性要求不高,所以每30分钟爬取一次新闻数据,并将数据保存在MongoDB中。
目前支持爬取的新闻网站:
- 腾讯新闻
- 凤凰资讯
项目代码:https://github.com/Laichj/box-spider (随手给星的都是长得帅的)
二、Web Magic爬虫框架
本项目引用了WebMagic框架,这里就不多唠叨,想要了解的可以看一下官方文档
WebMagic文档:http://webmagic.io/
三、项目使用
如果只想直接使用现成项目代码将项目跑起来,以达到爬取数据的目的,可以直接执行以下步骤:
1、项目导入
本项目使用maven管理项目,将项目代码下载下来之后,使用导入maven项目的方式导入到idea中,导入pom.xml中的依赖即可
2、MongoDB配置
启动项目之前,需要在 application.yml 配置文件中配置有效的MongoDB数据库
3、启动SpringBoot项目
执行 com.aposs.box.spider.BoxSpiderApplication 类中的main方法,即可启动项目
四、项目代码
使用springBoot开发项目的好处就是搭建框架的时候就像拼积木一样,将自己想要的东西都放在一起就好了。
关于项目代码及开发过程,简要梳理一下,具体的文件路径参考如下:
1、新增maven项目,并导入以下依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- springBoot项目必须依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.aposs.box</groupId>
<artifactId>box-spider</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<webmagic.version>0.7.3</webmagic.version>
<spring.boot.version>2.1.3.RELEASE</spring.boot.version>
<mongodb.version>3.12.7</mongodb.version>
</properties>
<dependencies>
<!-- 爬虫相关依赖,由于日志模块与SpringBoot字段日志模块冲突,需要exclusion -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>${webmagic.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>${webmagic.version}</version>
</dependency>
<!-- test相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mongodb相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>${mongodb.version}</version>
</dependency>
</dependencies>
<!-- 设定主仓库,按设定顺序进行查找。 -->
<repositories>
<repository>
<id>aliyun-central</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<name>aliyun maven</name>
</repository>
<repository>
<id>maven-central</id>
<url>http://repo1.maven.org/maven2/</url>
<name>maven</name>
</repository>
</repositories>
<!-- 设定插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>aliyun-repos</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</pluginRepository>
<pluginRepository>
<id>maven-central</id>
<url>http://repo1.maven.org/maven2/</url>
<name>maven</name>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、日志配置
日志模块使用springBoot自带的logback,配置每天自动生成一个日志文件
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pathroot" value="./logs"/>
<property name="filename" value="box-spider"/>
<property name="modname" value="box-spider"/>
<property name="log_format_simple" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] - %msg%n" />
<property name="log_format_general" value="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n" />
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [${modname} => %thread] %logger - %msg%n
</pattern>
</encoder>
</appender>
<appender name="rollingFile_main" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${pathroot}/${filename}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${pathroot}/${filename}.%d{yyyy-MM-dd}.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log_format_general}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<springProfile name="dev">
<logger name="com.aposs" level="info">
<appender-ref ref="rollingFile_main" />
</logger>
<!--<logger name="com.shuwei.poimp.service.common.dao.poimp" level="trace">-->
<!--<!–<appender-ref ref="stdout" />–>-->
<!--</logger>-->
<root level="info">
<appender-ref ref="stdout" />
</root>
</springProfile>
<springProfile name="prod,test">
<logger name="com.aposs" level="info" additivity="false">
<appender-ref ref="rollingFile_main" />
</logger>
<root level="info">
<appender-ref ref="stdout" />
</root>
</springProfile>
</configuration>
3、项目属性配置
必须修改的是MongoDB数据库配置,必须配置有效的数据库。定时任务执行间隔等参数,根据具体需求调整即可。
application.yml
spring:
application:
name: box-spider
profiles:
active: dev
# 配置存储数据的mongoDB数据库连接,需要配置有效的MongoDB数据库
data:
mongodb:
username: box
host: 127.0.0.1
port: 27017
password: 123456
database: box
# 每30分钟抓取腾讯新闻150条记录
box:
spider:
# 腾讯新闻 深圳新闻
tencentNews:
url: https://i.news.qq.com/trpc.qqnews_web.kv_srv.kv_srv_http_proxy/list?sub_srv_id=gd&srv_id=pc&offset=0&limit=
limit: 150
collectionName: tencentNewsJson
# 网易新闻 深圳
163News:
url: https://bendi.news.163.com/guangdong/special/04178NDR/news_sz.js
collectionName: 163NewsJson
# 凤凰新闻 资讯
ifengNews:
url: https://shankapi.ifeng.com/shanklist/_/getColumnInfo/_/dynamicFragment/6737905981943976661/
limit: 100
collectionName: ifengNewsJson
# 定时任务
cron: 0 */30 * * * ?
4、业务代码
程序入口:
虽然项目入口为com.aposs.box.spider.BoxSpiderApplication的main方法,但是业务逻辑的入口是com.aposs.box.spider.BoxSpiderRunner
BoxSpiderRunner实现了ApplicationRunner的run方法,在SpringBoot项目启动完成之后会立刻执行run()方法,然后根据Scheduled配置定时执行schedule()方法
爬虫逻辑:
com.aposs.box.spider.service:定义爬虫任务执行入口
com.aposs.box.spider.processor:定义爬虫程序页面解析逻辑
com.aposs.box.spider.pipeline:定义爬虫获取到的数据管道(数据存储逻辑)
数据库:
com.aposs.box.spider.dao:封装数据库操作
总结:
回顾了简单的爬虫项目开发,发现这张图是精髓。爬虫框架其实无非这几个模块,这个项目主要实现的逻辑包含Scheduler、PageProcesser、Pipeline这几个模块,不过在更复杂的爬虫项目中,Downloader模块也相当重要。这个项目只是作为Java程序员开发爬虫项目的一个入门尝试项目,爬虫开发还经常会涉及到很多反爬门槛,也是一项面向监狱编程。后续如有契机继续爬虫相关开发,再继续分享心得吧。