手把手Java爬虫教学 - 2. 爬虫项目创建 & 需求说明

上一篇博客我们简单的了解了一波爬虫,知道了什么是爬虫,爬虫的作用,下面我们就开始着手自己来创建一个爬虫。(项目源码估计你们得看最后的几个博客,因为我这个是一边写代码一边写博客的,所以说没有办法那么快提供给大家源码,但是可以先提供 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

版本介绍:

  • MySQL 版本:8.0.27(这个版本不强求,你自己会用啥数据库就用啥数据库,那怕存到 derby、h2 都行)
  • SpringBoot 版本:2.7.0(这个同样不强求,我这里一般都是用最新的 SpringBoot~)
  • htmlunit 版本:2.61.0(这个建议是和我的一样,因为版本高了低了可能会存在差异)

pom.xml:

这里我们除去必须要引入的,还引入了 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
		
	

application.yml:

这里根据自己的环境去配置就好了,如果不会 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-spring.xml

我这里日志用的是 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
        
    

	
        
        
        
        
        
    

测试:

测试前我们将数据库创建好,别因为连接不上数据库最后报错。

手把手Java爬虫教学 - 2. 爬虫项目创建 & 需求说明_第1张图片

我这里启动有两个 WARN,简单解释一下。

第一个 WARN:因为我们现在项目里面除去这些配置,屁的代码都没有写,所以说像 MyBatis 的 mapper 啥的根本都没有,不报错才怪,等后面加上就没事了。

第二个 WARN:这里是因为我们引入了 thymeleaf 所导致的,如果不想看这个错误,可以去 resources 目录下创建一个 templates 的目录就行。

自己动动手,把项目创建好,等下一讲我们来设计一下表。


这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com

你可能感兴趣的:(Java爬虫,爬虫,http,网络协议)