上一篇博客我们简单的了解了一波爬虫,知道了什么是爬虫,爬虫的作用,下面我们就开始着手自己来创建一个爬虫。(项目源码估计你们得看最后的几个博客,因为我这个是一边写代码一边写博客的,所以说没有办法那么快提供给大家源码,但是可以先提供 Git 地址)
项目源码 Git 地址:lemon1234_scraper: 一个基于 htmlunit 的 Java 爬虫项目(无页面版,有需要的同学可以自己 clone 下来后进行二开)。本项目切记慎用(请求频率过高,近乎DDOS的请求频率,一旦造成服务器瘫痪,约等于网络攻击),仅供学习使用~~~https://gitee.com/soul-sys/lemon1234_scraper
简单说一下我们这个项目是干啥的,不了到最后做完也不知道干了点啥,那不完蛋?
我这里是想通过爬虫采集一些博客的数据,采集好数据之后,想着后期把这些采集到的数据都扔在 es 里(es:elasticsearch,一种分布式全文搜索引擎,可以自行了解),然后通过页面搜索关键字,找到一些自己想要的数据。
当然,光采集博客数据还不能满足自己,为了能更好的摸鱼,我还打算爬一些轻小说、短文章的数据,将这些数据采集到本地,然后有时间可以慢慢看。
但是!!!我们这里先不涉及到 es,这个东西我最近在研究,等研究到差不多的时候我会出专门的博客去讲述。
等到项目做完的时候,大家也就学的差不多了,到时候项目可以自己去进行配置,自己选择一些可以爬取的网站进行爬取一些简单的数据。
我们爬虫项目主要基于 SpringBoot 框架,ORM 选择的是 MyBatis-Plus,爬虫我们使用的是 htmlunit。
这里主要说一下为啥用 htmlunit。我之前看过很多的爬虫框架,像 selenium、WebMagic、httpclient+jsoup 等等,很多很多,但是为啥选择了 htmlunit,这里要说一下。
比如 selenium,这个是由 Google 的很多大佬参与开发的一个产品,我们可以用它直接通过程序打开 Chrome 浏览器,然后页面会根据我们的程序自己去操作,当然,在操作的途中我们也可以获取到浏览器中的数据。但是这个玩意也是有坑的,效率贼慢,因为它是靠着浏览器驱动运行的,所以说这玩意不适合我们的项目,我们是定时爬取一大堆数据,就凭借它的效率,可以说直接凉凉。但是它也不是没有优点,selenium 几乎可以说是能爬到任何数据,只要你能用浏览器打开的页面,它都可以爬到该页面的数据。
再有就是 WebMagic 和 httpclient + jsoup 了。
先说 WebMagic,WebMagic 是一个简单灵活的Java爬虫框架,我们可以基于 WebMagic,快速地开发出一个高效、易维护的爬虫。但是为啥我们不用它呢?原因很简单,这玩意爬取不到由 js 加载的数据。我们很多页面,都是一个静态页面,然后里面的一些数据呢,是通过 js 请求后,拿到数据渲染到页面上的,类似这样的页面,WebMagic 可以说直接跪倒在地。
httpclient + jsoup 他俩虽说学起来很容易,运行速度也很快,API 也很简单,但是他俩和 WebMagic 一样,都有一个通病,就是拿不到由 js 加载的数据。
而我们选择的这个 htmlunit 可以说是比较完美了,它是一个没有界面的浏览器,通过模拟浏览器运行,拿到由 js 加载的数据后,返回给我们,然后我们再通过对页面的分析拿到我们所需要的数据,再进行后续操作,而且 API 接口啥的也比较简单易学,这也是我们选择它的原因。
lemon1234_scraper
这里我们除去必须要引入的,还引入了 thymeleaf,这里主要是为了后面二开的同学,省的自己再去找模板引擎
1.8
1.1.12
2.1.4
3.4.1
1.2.78
5.3.0
2.61.0
1.15.1
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.version}
com.baomidou
mybatis-plus-boot-starter
${mybatis_plus.version}
mysql
mysql-connector-java
runtime
com.alibaba
druid
${druid.version}
com.alibaba
fastjson
${fastjson.version}
cn.hutool
hutool-all
${hutool.version}
net.sourceforge.htmlunit
htmlunit
org.jsoup
jsoup
${jsoup.version}
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-devtools
runtime
true
这里根据自己的环境去配置就好了,如果不会 MyBatis-plus,建议去它官网简单看看学一学,不是很难。
server:
port: 80
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
spring:
application:
name: lemon1234_scraper
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/lemon1234_scraper?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
dbcp2:
min-idle: 5
initial-size: 5
max-total: 100
max-wait-millis: 1000
# Mybatis-plus相关配置
mybatis-plus:
global-config:
db-config:
id-type: UUID
table-prefix: t_lemon1234_scraper_
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: false
我这里日志用的是 logback,当然,你要用别的也行,无所谓的,有个能记录日志的就行。日志等级是 info。
logback
${log.pattern}
UTF-8
${log.path}/log_debug.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
100MB
15
debug
ACCEPT
DENY
${log.path}/log_info.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
100MB
15
info
ACCEPT
DENY
${log.path}/log_warn.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
100MB
15
warn
ACCEPT
DENY
${log.path}/log_error.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
100MB
15
ERROR
ACCEPT
DENY
测试前我们将数据库创建好,别因为连接不上数据库最后报错。
我这里启动有两个 WARN,简单解释一下。
第一个 WARN:因为我们现在项目里面除去这些配置,屁的代码都没有写,所以说像 MyBatis 的 mapper 啥的根本都没有,不报错才怪,等后面加上就没事了。
第二个 WARN:这里是因为我们引入了 thymeleaf 所导致的,如果不想看这个错误,可以去 resources 目录下创建一个 templates 的目录就行。
自己动动手,把项目创建好,等下一讲我们来设计一下表。
这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com