Java 爬虫多线程

家电修理 2023-07-16 19:17www.caominkang.com电器维修

多线程爬取京东商城数据 pom文件


 4.0.0

 
  spring-boot-starter-parent
  .springframeork.boot
  2.0.1.RELEASE
  
 
 .example
 mySpider
 1.0-SNAPSHOT

 
  
   .springframeork.boot
   spring-boot-starter-eb
   2.4.2
  
  
   .alibaba
   druid-spring-boot-starter
   1.2.4
  
  
   .springframeork.boot
   spring-boot-starter-test
   2.4.2
   test
  
  
   mysql
   mysql-connector-java
   8.0.22
  
  
   .alibaba
   fastjson
   1.2.73
  
  
   .google.guava
   guava
   22.0
  
  
   .jsoup
   jsoup
   1.14.2
  
  
   .apache.mons
   mons-lang3
   3.9
  
  
  
   .baomidou
   mybatis-plus-boot-starter
   3.4.1
  
  
   .baomidou
   mybatis-plus-generator
   3.4.1
  
  
  
   .freemarker
   freemarker
   2.3.28
  

  
   .projectlombok
   lombok
   1.18.8
  
  
   .apache.httpponents
   httpclient
   4.5.4
  

  
   .springframeork.boot
   spring-boot-starter-data-redis
  
  
   junit
   junit
   4.12
   test
  
 


yaml 文件
spring:
  datasource:
 url: jdbc:mysql://localhost:3306/spider?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
 driver-class-name: .mysql.cj.jdbc.Driver
 username: root
 passord: root
 dbcp2:
   min-idle: 5
   initial-size: 5
   max-total: 5
   max-ait-millis: 100
  redis:
 database: 0
 host: 127.0.0.1
 port: 6379
 passord: 123456

mysql表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for goods_info
-- ----------------------------
DROP TABLE IF EXISTS `goods_info`;
CREATE TABLE `goods_info`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goods_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `goods_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `goods_price` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `img_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

代码结构 技术点

1.SpringBoot
2.SpringMVC
3.HttpCli
4.Jsoup
5.多线程(线程池)
6.redis
7.mysql(mybatis-plus)

项目流程

1.启动类进行启动,开启 @PostConstruct,调用spiderHandle

2.spiderHandle
在spiderHandle中,使用线程池处理任务,线程池工厂和拒绝策略由自己确定;引入countDonLatch进行线程同步,使主线程等待线程池的所有任务结束,便于计时。

3.SpiderService处理爬取数据,进行解析,批量插入到数据库中.注意因为是多线程成爬取,如果爬取的数据需要存入集合,需要采用并发安全的List,这里使用了synchronized锁

4.GoodsInfoMapper
是使用mybatis-plus生成得到

5.Redis队列
因为在爬取的时候可能因为网络等原因,爬取的那一条数据会失败。,将爬取的页码放入到redis中。

redisTemplate.opsForList().leftPush("page",parms.get("page"));

我在后台重新启动一个线程,自旋的形式将Redis的队列中的数据阻塞式取出。然后再一次爬取。

  for (int i = 1; i < 201; i += 2) {
   Map params = ne HashMap<>();
   params.put("keyord", "零食");
   params.put("enc", "utf-8");
   params.put("c", "零食");
   params.put("page", i + "");
   threadPoolExecutor.execute(() -> {
    goodsInfoService.spiderData(SysConstant.BASE_URL, params);
    countDonLatch.countDon();
   });
  }
爬虫思路 源代码地址

源代码在本人github上多线程爬虫

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by