博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
阅读量:5170 次
发布时间:2019-06-13

本文共 4423 字,大约阅读时间需要 14 分钟。

闲暇之余写了一个爬虫例子。这期的Python学习教程打算跟大家作为一个实例教程。爬取京东的用户评价,通过分析爬取的数据能得到很多结果,比如,哪一种颜色的bra最受女性欢迎,以及中国女性的平均size (仅供参考哈~一对一实际感受最合适哈)

打开开发者工具-network,在用户评价页面我们发现浏览器有这样一个请求:

通过分析我们发现主要用的参数有三个productId,page,pageSize。后两个为分页参数,productId是每个商品的id,通过这个id去获取商品的评价记录,所以我们只需要知道每个商品的productId就轻而易举的获取评价了。再来分析搜索页面的网页源代码

通过分析我们发现每个商品都在li标签中,而li标签又有一个data-pid属性,这个对应的值就是商品的productId了。

大概了解了整个流程,就可以开始我们的爬虫工作了。

首先我们需要在搜索页面获取商品的id,为下面爬取用户评价提供productId。key_word为搜索的关键字,这里就是【内衣】

importrequestsimportre"""

查询商品id

"""deffind_product_id(key_word):jd_url='https://search.jd.com/Search'product_ids=[]# 爬前3页的商品foriinrange(1,4):param={'keyword':key_word,'enc':'utf-8','page':i}response=requests.get(jd_url,params=param)# 商品idids=re.findall('data-pid="(.*?)"',response.text,re.S)product_ids+=idsreturnproduct_ids

将前三页的商品id放入列表中,接下来我们就可以爬取评价了

我们通过分析preview发现获取用户评价这个请求响应的格式是一个字符串后面拼接了一个json(如下图),所以我们只要将无用的字符删除掉,就可以获取到我们想要的json对象了。

而在json对象中的comments的内容就是我们最终想要的评价记录

"""

获取评论内容

"""defget_comment_message(product_id):urls=['https://sclub.jd.com/comment/productPageComments.action?'\'callback=fetchJSON_comment98vv53282&'\'productId={}'\'&score=0&sortType=5&'\'page={}'\'&pageSize=10&isShadowSku=0&rid=0&fold=1'.format(product_id,page)forpageinrange(1,11)]forurlinurls:response=requests.get(url)html=response.text# 删除无用字符html=html.replace('fetchJSON_comment98vv53282(','').replace(');','')data=json.loads(html)comments=data['comments']t=threading.Thread(target=save_mongo,args=(comments,))t.start()

在这个方法中只获取了前10页的评价的url,放到urls这个列表中。通过循环获取不同页面的评价记录,这时启动了一个线程用来将留言数据存到到MongoDB中。(线程在前面的Python学习教程中有详细跟大家讲到)

Python学习教程我们继续分析评价记录这个接口发现我们想要的两条数据

productColor:产品颜色

productSize:产品尺寸

# mongo服务client=pymongo.MongoClient('mongodb://127.0.0.1:27017/')# jd数据库db=client.jd# product表,没有自动创建product_db=db.product# 保存mongodefsave_mongo(comments):forcommentincomments:product_data={}# 颜色# flush_data清洗数据的方法product_data['product_color']=flush_data(comment['productColor'])# sizeproduct_data['product_size']=flush_data(comment['productSize'])# 评论内容product_data['comment_content']=comment['content']# create_timeproduct_data['create_time']=comment['creationTime']# 插入mongoproduct_db.insert(product_data)

因为每种商品的颜色、尺寸描述上有差异,为了方面统计,我们进行了简单的数据清洗。这段代码非常的不Pythonic。不过只是一个小demo,大家无视即可。

defflush_data(data):if'肤'indata:return'肤色'if'黑'indata:return'黑色'if'紫'indata:return'紫色'if'粉'indata:return'粉色'if'蓝'indata:return'蓝色'if'白'indata:return'白色'if'灰'indata:return'灰色'if'槟'indata:return'香槟色'if'琥'indata:return'琥珀色'if'红'indata:return'红色'if'紫'indata:return'紫色'if'A'indata:return'A'if'B'indata:return'B'if'C'indata:return'C'if'D'indata:return'D'

这几个模块的功能编写完毕,下面只需要将他们联系起来

# 创建一个线程锁lock=threading.Lock()# 获取评论线程defspider_jd(ids):whileids:# 加锁lock.acquire()# 取出第一个元素id=ids[0]# 将取出的元素从列表中删除,避免重复加载delids[0]# 释放锁lock.release()# 获取评论内容get_comment_message(id)product_ids=find_product_id('胸罩')foriin(1,5):# 增加一个获取评论的线程t=threading.Thread(target=spider_jd,args=(product_ids,))# 启动线程t.start()

上面代码加锁的原因是为了防止重复消费共享变量

运行之后的查看MongoDB:

得到结果之后,为了能更直观的表现数据,我们可以用matplotlib库进行图表化展示

importpymongofrompylabimport*client=pymongo.MongoClient('mongodb://127.0.0.1:27017/')# jd数据库db=client.jd# product表,没有自动创建product_db=db.product# 统计以下几个颜色color_arr=['肤色','黑色','紫色','粉色','蓝色','白色','灰色','香槟色','红色']color_num_arr=[]foriincolor_arr:num=product_db.count({'product_color':i})color_num_arr.append(num)# 显示的颜色color_arr=['bisque','black','purple','pink','blue','white','gray','peru','red']#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数#shadow,饼是否有阴影#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看#pctdistance,百分比的text离圆心的距离#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本patches,l_text,p_text=plt.pie(sizes,labels=labels,colors=colors,labeldistance=1.1,autopct='%3.1f%%',shadow=False,startangle=90,pctdistance=0.6)#改变文本的大小#方法是把每一个text遍历。调用set_size方法设置它的属性fortinl_text:t.set_size=(30)fortinp_text:t.set_size=(20)# 设置x,y轴刻度一致,这样饼图才能是圆的plt.axis('equal')plt.title("内衣颜色比例图",fontproperties="SimHei")#plt.legend()plt.show()

运行代码,我们发现肤色的最受欢迎 其次是黑色 (钢铁直男表示不知道是不是真的…)

接下来我们再来统计一下size 的分布图,这里用柱状图进行显示

index=["A","B","C","D"]client=pymongo.MongoClient('mongodb://127.0.0.1:27017/')db=client.jdproduct_db=db.productvalue=[]foriinindex:num=product_db.count({'product_size':i})value.append(num)plt.bar(left=index,height=value,color="green",width=0.5)plt.show()

运行后我们发现 B size的女性更多一些

总结一句:小是多数,大是少数!真爱无价!更多的Python学习教程也会在接下来的教程中继续为大家更新!

转载于:https://juejin.im/post/5d3fdb4f5188255d2f64ca2b

你可能感兴趣的文章
setImageBitmap和setImageResource
查看>>
springMVC4 注解配置实例
查看>>
单片机编程
查看>>
Filter in Servlet
查看>>
Linux--SquashFS
查看>>
Application Pool Identities
查看>>
2017-3-24 开通博客园
查看>>
【MySQL性能优化】MySQL常见SQL错误用法
查看>>
Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
查看>>
Struts 2 常用技术
查看>>
树形DP
查看>>
python flask解决上传下载的问题
查看>>
语法测试
查看>>
CES1
查看>>
CES2
查看>>
文件方式实现完整的英文词频统计实例
查看>>
单个SWF文件loading加载详解(转)
查看>>
SQLServer中的CTE通用表表达式
查看>>
C# 3.0 LINQ的准备工作
查看>>
静态代码审查工具FxCop插件开发(c#)
查看>>