3.3、苏宁百万级商品爬取 代码讲解 商品爬取

简介: 接下去进入代码的模块,首先我们分析一下如何实现代码我们拥有一张类别表,类别表中记录了 类别名称,编码,地址,该类别所拥有的页数等信息类别表.png抽象描述:取出所有的类别循环类别集合循环类别页数得到当前类别当前页集合数据插入数据库对上述内容我们又几个地方需要注意,我们依次说明第一点 数量量大类别大致有4000多个,每个类别页数各不相同(一页60个商品是固定的),这么多的商品数据,如果我们还是采用同步方法依次执行的话,效率势必大打折扣,爬取所需花费的时间也很长。

接下去进入代码的模块,首先我们分析一下如何实现代码
我们拥有一张类别表,类别表中记录了 类别名称,编码,地址,该类别所拥有的页数等信息


img_63fe6bc530316f5eedd6ef41162abee7.png
类别表.png

抽象描述:

  1. 取出所有的类别
  2. 循环类别集合
    循环类别页数
    得到当前类别当前页集合数据
    插入数据库

对上述内容我们又几个地方需要注意,我们依次说明

第一点 数量量大

类别大致有4000多个,每个类别页数各不相同(一页60个商品是固定的),这么多的商品数据,如果我们还是采用同步方法依次执行的话,效率势必大打折扣,爬取所需花费的时间也很长。这个时候我们就要考虑多线程执行。
作者的思路是这样的:
不管数据量有多少,固定线程数量20个,即我只开20个线程处理任务。每个线程处理一个类别的工作任务。因为有的类别页数有100个,有的类别页数只有10个,这一块如何继续平均分配,不做考虑,各位可以开动大家的脑筋。

第二点 数据库如何存储

如此多的数据,我们应该如何存储。我们爬取的是相同的商品数据,只是内容不同。所以很自然的我们想到了分表。我们既然分表了,那么势必涉及到以后的查询,查询我们以后使用的是Lucene,自己建立一个简答的搜索引擎。在此基础之上,我们在表设计的时候就没有太大的约束。以下是我的商品表的设计图

img_58598cbabe74745c63fa8b8c1782a162.png
商品数据表.png

Id 主键自增
SUID  商品唯一码
CategoryId 商品类别
Titile 商品名称
Description 商品描述
Price 价格
Url 地址
ShopName 店铺名称

商品编码来源于每一个li标签的id【如下图】,我们可以看到这是一个数字编码。我假设这个编码是一个自增的数字,那么我就可以使用百分取余的方法确定这个商品应该放在哪个表中。这是什么意思呢。
我们假设自己有20张表,每个表的数据结构都如上述描述的那样,那我们要解决的问题就是数据应该如何存储的问题。
自增数字的取余意思就是。如果当前编号是30001
30001 % 20=1 存放在商品表1中 Commodity_01
40871 % 20=11 存放在商品表11中 Commodity_11
这样做的好处是什么呢,因为商品如果是自增累加的。通过此方法可以平均分配每张表的数据,不会让某张表数据多,而某张表数据少

img_e91631e9ebe75c315ae944c26f44deee.png
image.png

第三点 数据插入如何操作

我们可以从上文中了解到,在得到当前也数据后,我们要将其集合(60个)插入数据库,选用何种方式可以保证事务基础上又减少数据库链接是要考虑的问题。
以下是我的思路,贴代码讲解
代码为剪贴版,要看全部代码可以去我的github上面下载最新的源码

 //取值
List<POCO_Commodity> cateList = CommodityAnalysis.GetData(category.Url, category.Id, i);
 //处理
 List<CommodityGroupInput> groupList = cateList.GroupBy(u => Convert.ToInt64(u.SUId) % StaticConst.CategorySheetCount).Select(u => new CommodityGroupInput
 {
Id = u.Key,
Units = u.OrderBy(p => p.SUId).ToList()
}).ToList();
 //入库
_commodityService.InsertGroupBulk(groupList);

第一步取值,参数为 地址,类别码,页码
第二步是对List集合的分组,分组条件为唯一码%20,得到的内容为
[表索引号,对应的集合]
第三步,入库,代码贴图如下

img_8c16fda4f4e485c2d56d278628795a59.png
入库代码.png

入库数据库操作我通过dapper实现,不知道dapper是什么的,可以自行百度。代码的解释如下,使用dapper数据库链接,开启事务,对形参集合进行SQL语句拼接。

目录
相关文章
|
人工智能 JavaScript Shell
Github 2024-06-10开源项目周报 Top15
根据Github Trendings的统计,本周(2024年6月10日统计)共有15个项目上榜。按开发语言分类,上榜项目数量如下:Python 8项,Jupyter Notebook 和 Go 各2项,C++、Shell、Lua 和 JavaScript 各1项。亮点项目包括Python-100天从新手到大师、Syncthing开源同步工具、初学者的生成式人工智能(第2版)等。这些项目涵盖了代码教育、文件同步、数据分析等多个领域。
351 1
|
机器学习/深度学习 人工智能 安全
AI技术在医疗领域的应用及其挑战
【8月更文挑战第28天】本文主要探讨了AI技术在医疗领域的应用,包括疾病诊断、药物研发等方面。同时,也分析了AI在医疗领域面临的挑战,如数据隐私问题、技术准确性等。最后,提出了未来AI在医疗领域的发展趋势和可能的解决方案。
|
编解码 自然语言处理 并行计算
【经典论文解读】YOLACT 实例分割(YOLOv5、YOLOv8实例分割的基础)
 YOLACT是经典的单阶段、实时、实例分割方法,在YOLOv5和YOLOv8中的实例分割,也是基于 YOLACT实现的,有必要理解一下它的模型结构和设计思路。
4078 0
|
消息中间件 物联网 Java
阿里云物联网平台物模型功能测试示例Demo
物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。物模型将产品功能类型分为三类:属性、服务、和事件。定义了这三类功能,即完成了物模型的定义。
2699 0
阿里云物联网平台物模型功能测试示例Demo
|
机器学习/深度学习 算法 物联网
基于深度前馈序列记忆网络,如何将语音合成速度提升四倍?
我们提出了一种基于深度前馈序列记忆网络的语音合成系统。该系统在达到与基于双向长短时记忆单元的语音合成系统一致的主观听感的同时,模型大小只有后者的四分之一,且合成速度是后者的四倍,非常适合于对内存占用和计算效率非常敏感的端上产品环境。
1148 0
|
开发工具 开发者 vr&ar
|
1天前
|
数据采集 人工智能 安全
|
10天前
|
云安全 监控 安全
|
2天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
910 150