抓取唯品会商品数据

目标网站:http://www.vip.com/

方法:scrapy Mysql 正则表达式

思路

第一步:分析爬虫入口,需要爬取唯品会在售的所有商品,打开首页可以看到有个分类按钮,点击进去分为商品分类和品牌分类。想要一并分析一下各品牌的受欢迎程度和在售商品数量,所以选择品牌分类。入口找到:http://category.vip.com/?act=brand
第二步:找到各品牌页面的url
第三步:爬取各品牌页面下的商品数据和品牌收藏数、商品数量。
第四步:在mysql数据库中,分表存储品牌数据和商品数据,两表以品牌ID来关联。

实战

基本思路就是上面的,下面开干。
首先,打开品牌分类页,可以看到各大类下都有小的分类,不过最前面有个全部,里面包涵了该大类下的全部品牌,点击品牌图片可进入对应的品牌页,我们只需要通过xpath定位到每个品牌小格子来提取url即可,不过我们查看品牌分类页的网页源码并没有找到这些url,所以可以怀疑这个是异步加载的。右键审查元素,打开log,刷新页面,页面往下拉,显示出第一个分类品质女装的品牌信息。可以看到加载了一个XHR格式的页面和一堆的图片,看一下这个页面返回的数据,看到data的值中是一个列表,展开第一个元素,可以发现’name :"乐为COMME LA VIE帽子专场",和第一个品牌对上了,link的值也和该品牌的url对上了,再看后面的元素也能对上。

抓取唯品会商品数据_第1张图片
抓取品牌数据

这时,可以确定这个页面就是品牌数据页面,反过来看看请求数据。是一个get请求,但是有很多请求参数,对比多个大类的品牌数据页可以发现只有三个值是变动的
抓取唯品会商品数据_第2张图片
get请求参数

callback 分析可以看到是每个大类的英文名称0
department_idnew_cat_id 这都是一些数据,看似毫无规律,不过在查看品牌分类页面源码时发现中间有很大一段的javascript代码,完全看不懂,不过倒也是有一些数字,观察可以发现其实都出自这里。
抓取唯品会商品数据_第3张图片
网页源码中包涵的数据
请求参数都找到了,通过正则表达式获取这段代码,再用eval函数来格式化,后面就可以以字典的形式来取值。之后直接构造get请求的url。测试发现,每个品牌的url只是ID的改变,这个id就是brand_id,那么只需要爬取到这个即可。返回的代码也不是js代码,同样使用正则表达式和eval来格式化数据方便取值。

得到品牌页面的url后,可以看到有一个收藏品牌数,我们就以此作为品牌受欢迎的数值提现。那么我们先来找到这个数据。在页面源码中同样搜不到现在的收藏数。审查元素可以初步判断是来自javascript。
抓包查看js,能找到这个收藏数。

抓取唯品会商品数据_第4张图片
抓包收藏数
该get请求的参数只有brand_id,这个简单。不过在调试过程中无法正常获值,后来测试发现请求头中需要加上 Referer,这样就正常了。
再来抓包分析商品数据,发现也是来自XHR类型页面,打开品牌页面时加载了3个XHR页面,第一个返回的是该品牌下的商品分类,第二个返回的主要是一些数字列表,第三个就是我们想要的商品数据。
抓取唯品会商品数据_第5张图片
抓包分析商品数据
不过这个get请求的参数有点多,变化的只有两个值 productIdsr,其中r为品牌id, productIds这里面是数字列表,分析发现这些都来自第二个XHR页面返回的数据
抓取唯品会商品数据_第6张图片
商品信息请求参数抓包
其中 products的数据即是前面的 productIds,这也是商品ID,只是默认一次只加载50个商品。'total'为该品牌商品总数。
接下来,我们分析该get请求, fromIndex为起始值, batchSize截止值。
接下来就可以带入参数发起get请求获取到 products后,再带入商品数据页面的请求,获取到商品信息,然后存储到mysql数据库。
不多说,直接上代码:

class VipSpider(scrapy.Spider):
    name = 'vip'
    allowed_domains = ['vip.com']
    start_urls = ['http://category.vip.com/?act=brand']

    def parse(self, response):
        #获取源码里的json数据,包涵分类名称,品牌信息页面的ID连接所需的数据
        data = eval(re.findall(r'
                    
                    

你可能感兴趣的:(抓取唯品会商品数据)