前言
对于大型电商平台,通常情况下商品列表页都会有翻页限制,即展示商品的数量限制。这种情况下,如果我们要抓取尽可能全的商品信息的话,就需要通过filter条件来进行遍历。当然策略可以根据具体的需求决定,比如通过销量排序,类别排序,品牌排序等等。这里主要介绍一个通用的遍历方式,即价格排序。
思考
- 普通的价格高低排序能否遍历完全
- 如果不能,那么如何确定价格区间,以及如何在排序区间内拆分
背景
最近在处理一些大型的C2C电商平台项目,平台的商品量级大概是千万级别。通过传统的品类入口进行商品遍历会有局限性,比如翻页限制是100页,每页展示的商品量是60个。那么每个品类只能抓取到的商品量只有6000个,远远没办法实现平台的商品覆盖率。这时候解决的方式有很多种,比如说通过品类&品牌的组合方式进行遍历,但是这种遍历方式有一个缺陷,就是大部分的组合方式下商品量极少或者商品量为0,那么就会产生大量的无用任务,严重浪费资源。所以本文介绍一个方式就是通过价格的方式来进行遍历。
价格拆分策略
- 按照大型电商平台的商品量级来考虑,正常的按照价格高低的顺序排序是无法满足商品覆盖率的需求的
- 因此,通过价格拆分来进行筛选的策略就能发挥用途了
获取价格区间
要进行价格拆分,首先得先获取到价格区间。那么如何获取价格区间呢?这里举个例子,比如电器品类下,我们只需要进行一次价格高低排序,就能够拿到该品类下的商品位于哪个价格区间内了。
价格拆分
好了,现在我们获取到了价格区间了,那么如何进行价格拆分最合理最快捷呢?
我们是设定一个价格,比如说10元为一个区间,然后把价格区间按照10元来进行划分,然后每个区间遍历一次吗?当然不会选择这么笨的方式,这时候可以用到一个很常用的算法了–二分查找。
既然提到二分查找了,那就先来复习一下二分查找算法的原理。
在计算机科学中,二分搜索(binary search),也称折半搜索(half-interval search)、对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
二分查找python实现
def BinarySearch(arr, left, right, num):
if right >= left:
mid = int(left + (left + right)/2)
if arr[mid] == num:
return mid
elif arr[mid] > num:
return BinarySearch(arr, left, mid - 1, num)
else:
return BinarySearch(arr, mid + 1, right, num)
else:
return -1
二分查找的应用
根据之前拿到的区间,我们可以通过二分,取到价格的中间值,遍历两段价格区间,分别统计两段区间内的商品数量。假如:
- 二分后的数目依旧大于翻页上限,继续二分
- 二分后的数目小于翻页上限,拆分结束,目的达到。此价格区间为拆分的最小区间。
备注:
这里有两点小建议:
- 建议在划分最小区间时,建议数量上限设置在最大值的80%左右,一个是避免爬取过程中有新的商品在此区间上线,如果又超出了数量上限,又得进行一次拆分,相对麻烦。
- 建议用一张表来记录每个最小区间以及区间内数量。这样的做法一个是方便对价格区间内的商品进行一个统计,用于观察商品主要集中于哪个价格区间,如果需要改动爬取策略的时候,可以借此为一个考虑条件;第二就是进行第二次遍历的时候,可以直接从该表中取价格区间作为参数进行爬取任务的添加。
总结
价格拆分的策略对于大型网站来说非常有用,还有其他的遍历策略以后有机会再补充。