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

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


类别表.png

抽象描述:

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

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

第一点 数量量大

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

第二点 数据库如何存储

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

商品数据表.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
这样做的好处是什么呢,因为商品如果是自增累加的。通过此方法可以平均分配每张表的数据,不会让某张表数据多,而某张表数据少

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,得到的内容为
[表索引号,对应的集合]
第三步,入库,代码贴图如下

入库代码.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,101评论 1 32
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,931评论 2 89
  • 通过上述章节内容,我们得到了类别的数据,现在我们需要对每个类别进行商品的爬取。点击移动电源,进行商品总页数抓取,这...
    HapplyFox阅读 405评论 0 1
  • 七律 窗(新韵) 户门依靠共辉荣,笑对三伏与冷冬。 闲看青山连远树,好观流水绕奇峰。 听竹无语花千片,望月生情意万...
    南风窗A阅读 440评论 0 1
  • 【300663科蓝软件】【603133碳元科技】此股虚拟成交量放大,今日有望再度封板,可重点关注。
    亻壬我行阅读 157评论 0 7