电商网站爬虫逻辑

爬取电商平台常用逻辑套路

Posted by HugoNgai on August 23, 2019

前言

最近在做电商平台苏宁的爬虫项目,在此记录下爬虫的逻辑设计,主要设计到爬虫的深度遍历和广度遍历。基本上运用这种逻辑可以应付很多类型的电商平台的爬取。

问题
  • 如何遍历商品
  • 如何确保能够遍历全

逻辑实现

​ 根据上面的两个问题,先来看第一个问题。


遍历商品

品类

​ 一般来说,上电商平台去购物, 就跟我们去超市一样,如何找到我们想要的商品,首先从商品的品类出发,定位商品品类,然后在该品类下去搜索我们想要的商品。因此第一步,要遍历商品,先从平台的品类出发,抓取品类列表。

​ 举个🌰,从苏宁的网页上,我们可以看到有全部商品分类的列表,可以将其划分为三个级别,分别为一级品类,如手机/数码/配件,二级品类,如手机通讯,三级品类,手机。然后我们在写爬虫的时候,可以分别把三级的品类全部抓取下来,已对应的品类关系进行一个存储。抓取品类的方式,基本上就两种,一就是简单的解析页面,根据页面源码,通过xpath或者css等手段抓取,相对而言比较麻烦,需要理清源码的结构;二就是通过抓包,看看有没有相对应的借口,通过借口返回的json获取到我们想要的数据。

商品列表

​ 品类抓取下来了,下一步就到商品的列表页了。通常来说,我们可以直接通过三级品类去进行商品的搜索,比如想要找手机,我们可以点击页面上的手机分类,就可以进行手机的遍历。接下来要说的是,在三级品类搜索出来的商品列表页,我们可以获得什么信息。首先,我们可以获取到该品类下的对应商品列表,在该页面,通常我们可以抓取到商品的title,价格,评论数等信息,在这里我们可以进行一波数据抓取,存储下商品的基本信息。

商品详情页

​ 在商品列表页抓取了一部分数据之后,如果我们还想要获取更多的商品信息呢,就需要进入到商品详情页了。在商品详情页,我们可以获取到评论,销量,sku等等的信息。那这个时候,就涉及到如何通过爬虫程序进入到商品的详情页。常见的方法:一、通过商品列表页的页面源码,通常我们可以获取到商品对应的href,访问href即可进入到该商品的详情页面;二、假如找不到href怎么办?那就得通过观察商品详情页的URL。从一般的商品详情页URL里面,我们都可以找到规律。比如说,是通过拼接商品的品类id,店铺id和商品的id来获得商品的详情页URL。那么如何获取到上述的id呢,从品类列表里,我们可以通过html源码获得或者通过接口返回的json数据获取。同理,在商品列表页我们也可以获得这些信息,一般情况下。总言之,就是尽量找到接口,通过json的解析可以获取到很多有用的信息。至于怎么找到接口,这个就得多实践,根据经验来找了。


数据抓全

​ 第二个问题就是如何确保商品抓全。根据这个问题,我们通过所有品类的遍历,理论上可以通往所有商品列表;这里需要引入一点,就是电商平台,往往会有店铺的概念,那么如果我们能够获取到这个平台上所有的店铺信息,通过遍历每个店铺的商品,就基本上可以把商品抓全了。下面从商品列表和商品详情页两部分来讨论,怎么抓全数据。

商品列表

​ 访问商品列表页的时候,除了可以获得商品的一些基本信息外,还会有商品归属的店铺信息,从这里入手,我们需要拿到所有的店铺信息。那么要拿到全部的店铺信息,我们就得把所有商品都遍历一遍,从每个商品栏拿到店铺信息。最简单的方式,就是从该页面找到服务器传回来的接口(以苏宁为例),不确保每个电商平台都能拿到接口。通过解析接口返回的json数据,我们可以获得店铺的信息。

  • 如何获取全部商品

​ 很多时候我们会发现,商品的展示页面只会显示前50页或者100页,这种情况下,很大概率的抓不全商品的。这个时候,我们就得通过改变filter来多次访问,做到尽量获取完整的商品。比如根据销量排序,根据价格排序,根据价格区间等进行一个筛选。做到尽可能多得抓全可以显示到页面上的数据。那如何加入filter进行筛选呢,同理,通过观察URL的规律,进行URL的拼接,是get请求,还是post请求,如果是get请求,那么就可以通过拼接url来实现filter的筛选,如果是post请求,就需要分析该post请求下,需要发送的form数据是什么。翻页的操作原理也是如此,看是通过get请求传一个页数,还是通过post请求,进行ajax动态地加载等等。

商品详情页

​ 既然到了商品列表页能够抓取尽量多的商品了,为什么还要用到商品详情页呢。因为很多时候,我们会发现在商品列表页下,一些同类别的商品不会全部显示出来,它会被归入到这个显示出来的商品下,所以这个时候我们还要进行详情页的一个遍历,在详情页面下查找是否还有漏掉的商品没有抓取。在商品详情页,我们可以将抓到的商品数据进行一个filter判断,如果已经抓取过了,那就无视,如果并没有,那么我们就把它当作一个新的任务进行再次抓取。


最后

​ 对于大型网站的抓取,最好使用的方式是把它进行拆分,分别用不同的爬虫来进行抓取。最好的方式是运用队列,把每一个爬虫任务放入到队列中,爬虫程序从队列中取任务进行爬取。比如说,我们把每一个商品的商品详情页当作一个任务,扔进任务池中;把商品列表页翻出来的每一页当作一个任务,扔进任务池。尽量不要做到把所有的逻辑写到同一个爬虫当中去,这样子在出现问题时,很难去分开解决,而且如果翻页逻辑什么多的时候,代码的逻辑就会很混乱。简言之,就是把复杂的问题简单化。实践出真知,多实践写写代码,就会掌握这种类型网站的爬取规律。有问题欢迎指出,🙏。