前言
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: shenzhongqiang
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入
分析思路思路很简单,上京东商城把所有手机的数据爬下来,然后根据配置、价格过滤出符合条件的手机,在过滤出来的手机里选择一部性价比最高的。画成流程图,大致是这样的
第一步,我们先从京东商城爬取所有在售的手机数据。这里我们关心的主要是价格和配置信息,商品页面上的价格和配置信息像下面两张图所示
我们编写代码爬取所有手机的价格和配置信息,爬虫的核心代码如下
'''
python学习交流群:1136201545更多学习资料可以加群获取
'''
# 获取手机单品的价格
def get_price(skuid):
url = "https://c0.3.cn/stock?skuId=" + str(skuid) + "&area=1_72_4137_0&venderId=1000004123&cat=9987,653,655&buyNum=1&choseSuitSkuIds=&extraParam={%22originid%22:%221%22}&ch=1&fqsp=0&pduid=15379228074621272760279&pdpin=&detailedAdd=null&callback=jQuery3285040"
r = requests.get(url, verify=False)
content = r.content.decode('GBK')
matched = re.search(r'jQuery\d+\((.*)\)', content, re.M)
if matched:
data = json.loads(matched.group(1))
price = float(data["stock"]["jdPrice"]["p"])
return price
return 0
# 获取手机的配置信息
def get_item(skuid, url):
price = get_price(skuid)
r = requests.get(url, verify=False)
content = r.content
root = etree.HTML(content)
nodes = root.xpath('.//div[@class="Ptable"]/div[@class="Ptable-item"]')
params = {"price": price, "skuid": skuid}
for node in nodes:
text_nodes = node.xpath('./dl')[0]
k = ""
v = ""
for text_node in text_nodes:
if text_node.tag == "dt":
k = text_node.text
elif text_node.tag == "dd" and "class" not in text_node.attrib:
v = text_node.text
params[k] = v
return params
# 获取一个页面中的所有手机信息
def get_cellphone(page):
url = "https://list.jd.com/list.html?cat=9987,653,655&page={}&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=4#J_main".format(page)
r = requests.get(url, verify=False)
content = r.content.decode("utf-8")
root = etree.HTML(content)
cell_nodes = root.xpath('.//div[@class="p-img"]/a')
client = pymongo.MongoClient()
db = client[DB]
for node in cell_nodes:
item_url = fix_url(node.attrib["href"])
matched = re.search('item.jd.com/(\d+)\.html', item_url)
skuid = int(matched.group(1))
saved = db.items.find({"skuid": skuid}).count()
if saved > 0:
print(saved)
continue
item = get_item(skuid, item_url)
# 结果存入MongoDB
db.items.insert(item)
需要注意的是,上面的get_price和get_item函数分别从两个url获取数据,这是因为配置信息可以直接从商品页面中解析得到,而价格信息需要从另外一个ajax请求里获得。爬下来的所有数据存入MongoDB。
过滤数据爬下来的手机数据当中,信息完整的共有4700多条数据,这4700多部手机属于70个手机品牌。 这些品牌画成词云图是这样的 手机的配置主要有以下这些参数
- 是否双卡双待
- 机身材质
- CPU型号
- 内存大小
- 存储容量
- 电池容量
- 屏幕材质
- 屏幕大小
- 分辨率
- 摄像头
平时用手机主要是看看书、刷刷知乎微信、买买东西,所以选购新手机的时候最关心的就是速度、容量、待机时间这几项,对摄像头、屏幕材质倒不是特别在乎。考虑以上因素,在对数据做过滤的时候,我设定了以下几个条件
- CPU的品牌是高通
- 内存大小大于等于6GB
- 存储容量大于等于64GB
- 电池容量大于3000mAh
- 必须是双卡双待
- 价格在1500元以内
过滤数据的代码如下
client = pymongo.MongoClient()
db = client[DB]
items = db.items.find({})
result = preprocess(items)
df = pd.DataFrame(result)
df_res = df[df.cpu_brand=="骁龙(Snapdragon)"][df.battery_cap >= 3000][df.rom >= 64][df.ram >= 6][df.dual_sim == True][df.price
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?