爬取Macy网用户评价日志(3): 根据url爬取产品信息(一): 爬取comment的设计
1. 需求阐述:
1' 假设:
1)假设所有产品的url都已经被爬取了,并保存到了本地mysql库中。
2' 需求:
1)爬取所有产品信息和评论;
2)信息:产品图片、价格、名称、url、WebID(经过分析,发现WebID是每一张产品的primary key)
评论:nickname, reviewtext, reviewrank等,其实还要有reviewer的性别年龄等(老师说,有啥爬啥。。。。。哎)
3)题外话:还是喜欢在公司干活,因为当需求不明的时候,可以找对应的人去敲定需求。不像在学校,导师自己根本不知道要什么。
在爬取的时候,居然要考虑爬取价格的时候是爬取打折之后的价格还是打折之前的价格。
(当我写这句话的时候,我想到了,两个都爬,一个是before price,一个是now price)
2. 具体实施:
1' 计划:
1)逐一从mysql中取出一个个产品的url,然后对该url发送请求,获取产品具体信息和评价;
2)分析产品页,产品信息和评价的特性,属于静态页面还是动态页面,然后采取不同的方法分别爬取;
3)爬取完成,存入mysql
2' 操作过程:
1)分析页面;
Macy's网的用户评价属于动态页面,需要通过抓动态package的方式才能获得评价信息。
1" 右击,检查。点击评论下一页。
2" 在Network/ Fetch/XHR下查看刷新review包。

3' 通过General中Request方法,我们发现,他是直接使用的GET方法。所以问题变得简单很多,不需要POST那样需要很多参数,并搞一些加密解密啥的。
4' 分析URL规律,根据对应产品换url就行。(于是找了个评论最多的产品进行分析),我们可以看到变化规律很明显。
https://www.macys.com/shop/product/cole-haan-womens-box-quilt-down-puffer-coat?ID=2813247&CategoryID=269&swatchColor=Navy
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=8
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=30&offset=8
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=30&offset=38
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=30&offset=68
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=30&offset=98
page20:
https://www.macys.com/xapi/digital/v1/product/2813247/reviews?_shoppingMode=SITE&_regionCode=US¤cyCode=USD&_customerState=GUEST&_deviceType=DESKTOP&sort=NEWEST&limit=30&offset=548
5' 分析评论包具体内容。(发现:基本除了价格,可以拿到我想要的所有的东西。fine,那就只爬取价格和webid,然后根据根据webid爬取review,然后根据webid去插入所有review上的所有内容)
{"review":{"hasErrors":false,
"includes":{},
"totalResults":10,
"locale":"en_US",
"reviews":[]}}
然后"includes"里面有具体product的信息。
products: {2813247: {name: "Cole Haan Box-Quilt Down Puffer Coat", productId: 2813247,…}}
2813247: {name: "Cole Haan Box-Quilt Down Puffer Coat", productId: 2813247,…}
description: "What wind chill? Keeping cozy is supremely easy with the layered design of Cole Haan's chic, knee-length puffer coat!"
imageUrl: "https://slimages.macysassets.com/is/image/MCY/products/4/optimized/19208664_fpx.tif?bgc=255,255,255&wid=134&qlt=90,0&layer=comp&op_sharpen=0&resMode=bicub&op_usm=0.7,1.0,0.5,0&fmt=jpeg"
name: "Cole Haan Box-Quilt Down Puffer Coat"
productId: 2813247
productPageUrl: "https://www.macys.com/shop/product/cole-haan-box-quilt-down-puffer-coat?ID=2813247&CategoryID=269"


2)设计数据库:
1' 不同于上一级别中,我们保存的是具体分类下的产品的详情页的url,因此在设计上一级别的数据库时,我们存储的是各个分类的url。但是在具体产品页,我们需要考虑产品需要爬取的信息。同时要考虑主键,外键问题。
2' 于是我去回顾了一下ER图,属性,实体这些关系。然后用脑子里仅有的几分钟知识去对应review的具体细节。
3' 然后,我做了一个大胆的决定。干脆把Macy的评论数据库爬下来吧,属性按review自己有的来。产品按产品自己的来。那么为了事情的稳定性。我可能要分别爬取两次,第一次爬取所有的产品信息,然后根据产品ID去爬取所有产品的评价信息。产品对评价属于1:N。
4' 那么就要考虑具体的数据库设计问题。
数据库设计参看next.今天不肝了。

浙公网安备 33010602011771号