python(爬虫)实例演示

时间:2022-02-07 03:33:36

    最近在看原前清皇帝溥仪的自传《我的前半生》, 这本小说记载了自他登基以来经历的奢华的宫闱生活,对答应日寇加冕成为伪满皇帝站在人民对立面的忏悔,以及在我党红色政权的拯救以及接收共产主义的洗礼的无限感恩。小说中多次提到各个年号下的所发生的一些事件,所以我想通过爬虫来抓取这部小说出现的“光绪”,“宣统”两朝年号下发生的事件,也是对爬虫知识的一次实际应用。

 

1).导入坐标依赖以及application.properties配置文件信息

 

python(爬虫)实例演示

python(爬虫)实例演示

 

2).编写SpringBoot启动类

python(爬虫)实例演示

 

3).实体类及数据库信息

python(爬虫)实例演示

python(爬虫)实例演示

 

4).将页面内容进行处理

python(爬虫)实例演示

 

. 定时任务scheduler

    在案例中我们使用的是Spring内置的Spring Task,这是Spring3.0加入的定时任务功能。我们使用注解的方式定时启动爬虫进行数据爬取。

    我们使用的是@Scheduled注解,在使用@Scheduled注解之前需要在Spring Boot启动类启动开启定时任务的注解@EnableScheduling。

@Scheduled注解属性如下:

 

1)croncron表达式,指定任务在特定时间执行;

 

2)fixedDelay:上一次任务执行完后多久再执行,参数类型为long,单位ms

 

3)fixedDelayString与fixedDelay含义一样,只是参数类型变为String

 

4)fixedRate按一定的频率执行任务,参数类型为long,单位ms

 

5)fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String

 

6)initialDelay延迟多久再第一次执行任务,参数类型为long,单位ms

 

7)initialDelayString与initialDelay的含义一样,只是将参数类型变为String

 

8)zone时区,默认为当前时区,一般没有用到

 

    我们这里的使用比较简单,固定的间隔时间来启动爬虫。例如可以实现项目启动后,每隔100秒启动一次爬虫。但是有可能业务要求更高,并不是定时定期处理,而是在特定的时间进行处理,这个时候我们之前的使用方式就不能满足需求了。例如我要在工作日(周一到周五)的晚上八点执行。这时我们就需要cron表达式了。

 

cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:

1.  Seconds(秒)  :可以用数字0-59 表示,

2.  Minutes(分) : 可以用数字0-59 表示

3.  Hours(时) : 可以用数字0-23表示

4.  Day-of-Month(天)  :可以用数字1-31 中的任一一个值,但要注意一些特别的月份

5.  Month(月) : 可以用0-11 或用字符串(JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC)

6.  Day-of-Week(天)  :可以用数字1-7表示(1 = 星期日)或用字符口串 (SUN, MON, TUE, WED, THU, FRI, SAT)

7.  Year(年)  (可选字段)

 

例  "0 0 12 ? * WED" 在每星期三下午12:00 执行,

 “*” 代表整个时间段

“?”:表示每月的某一天,或第周的某一天( Day-of-Month 和 Day-of-Week 两者只能出现其一)

 

“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行

“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”

 

②.程序执行流程

    (1).启动类执行后延时1秒即执行process()方法,并且没隔100秒均会执行一次此方法,此方法对Spider对象进行初始化。

  (2).processor(Page page)方法执行,此方法对Spider对象中的入口url解析:

    如若此页面是详情页面则通过saveArticle(Page page)对页面内容解析并封装到Article类中.

              如若此页面是列表页面则遍历此页面的链接并加入到Schduler组件管理。

      String html = page.getHtml().toString(): 获取Schduler组件下一个url地址的页面内容。

              page.putField("articleList", articleList) : 将封装的结果以键值对的形式存入Pipeline组件。


5).Pipeline组件处理结果

 python(爬虫)实例演示

    Pipeline组件类似Map集合以键值对的形式获取Processor组件封装的结果,此处的处理为将封装的ArticleList集合保存到数据库。

 

6).Service层代码

python(爬虫)实例演示

 

python(爬虫)实例演示

 

 7).dao层代码

python(爬虫)实例演示

 

dao持久层只需继承JpaRepository接口即可,Spring-Data-Jpa框架会自动以代理的形式为我们生成实例类,并且可以直接调用父接口的方法。框架实在是神奇所在,太方便,太好用了!!!

 

8)获取抓取结果

①.整个案例的目录结构:

python(爬虫)实例演示

 

.数据库保存结果:

python(爬虫)实例演示

 

     至此整个小案例的抓取效果以实现。