闲暇之余写了一个爬虫例子。这期的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

Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?相关推荐

  1. 这里是Python爬虫的起点,抢占资源啦(Python学习教程)

    今天跟大家出的这篇文章,是从爬虫的起点开始讲起,这里的Python学习教程,一篇文章带你贯穿爬虫始末!之前也够跟大家出过相关的Python相关的Python学习教程,伙伴们也可以翻阅一下以前的! 爬虫 ...

  2. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

  3. Python学习教程之算法讲解:深入浅出Apriori关联分析算法

    在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加.这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽然事 ...

  4. Python学习教程:手把手教你搭建自己的量化分析数据库

    Python学习教程:手把手教你搭建自己的量化分析数据库 引言: 数据是金融量化分析的重要基础,包括股票历史交易数据.上市公司基本面数据.宏观和行业数据等.随着信息流量的日益膨胀,学会获取.查询和加工 ...

  5. Python学习教程:用Python模拟登录淘宝

    今天跟大家出的Python学习教程,Python模拟登录淘宝,我知道,肯定是吸引了你,一起来看看吧! 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录 ...

  6. 编程界“网络工程师”都用过的Python学习教程+PDF电子版曝光了

    编程界"网络工程师"都用过的Python学习教程+PDF电子版曝光了 网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.网络工程师能够从事计算机信息系统的 ...

  7. Python学习网络爬虫--转

    原文地址:https://github.com/lining0806/PythonSpiderNotes Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scra ...

  8. Python学习教程(Python学习路线):Day08-面向对象编程基础

    Python学习教程(Python学习路线):面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程&qu ...

  9. Python学习教程(Python学习路线):第12天—正则表达式

    Python学习教程(Python学习路线):正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是 ...

  10. Python学习教程(Python学习路线):如何正确使用Pandas库提升项目的运行速度?...

    Python学习教程:如何正确使用Pandas库提升项目的运行速度? 如果你从事大数据工作,用Python的Pandas库时会发现很多惊喜.Pandas在数据科学和分析领域扮演越来越重要的角色,尤其是 ...

最新文章

  1. 不管你的x86能不能升级Win 11,反正树莓派能!|安装教程
  2. 从源码理解Redux和Koa2的中间件机制
  3. python如何使用apriori_python-如何加快基于Apriori框架的速度,以仅生...
  4. [以太坊源代码分析] I.区块和交易,合约和虚拟机
  5. UML模型中的图-行为图【交互图-序列图、协作图】
  6. Android 要收费、闭源恐难于上青天
  7. SpringCloud_004_SpringCloud服务发现组件原理介绍
  8. 每天一记 10.03.26
  9. 8.5 输入输出重定向
  10. 110. PHP 读取 ini ,ftp 上传
  11. 广东省计算机媒体大赛,年广东省大学生计算机设计大赛.doc
  12. 巨杉数据库支持的mysql兼容特性包括_核心特性_SequoiaDB简介_文档中心_SequoiaDB巨杉数据库...
  13. echarts中月份数据缺少怎么补齐呢?
  14. 2020中国高校计算机大赛网络技术挑战赛,喜报:我院学子喜获2020年中国高校计算机大赛-网络技术挑战赛13项奖励...
  15. BZOJ3926: [Zjoi20150]诸神眷顾的幻想乡
  16. 中括号文本添加下滑线样式
  17. 平台联合卖会员、用户拆着挂闲鱼,巨头联名会员卡命宿何方?
  18. 诺基亚106支持Java,如何使用诺基亚Java SDK 2.0在诺基亚40系列中实现推送通知?
  19. EasyPoi快速入门(Excel导入导出工具)
  20. kubernetes dashboard 安装

热门文章

  1. dell服务器怎么用u盘系统安装win7系统教程,戴尔DellU盘重装系统操作教程
  2. html基础之背景属性
  3. JDBC学习(七、批处理操作)
  4. LineBasedFrameDecoder 行解码器,回车换行符解决 TCP 粘包
  5. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_5_端口号...
  6. 丢失控制文件恢复实验记录--4(在线日志文件没有损坏,归档日志丢失,直接重建控制文件(跟踪控制文件trace是旧的情况))...
  7. python Image 模块处理图片
  8. Kotlin——初级篇(三):数据类型详解
  9. eclipse安装activiti 工作流插件
  10. (转)谷歌安卓官方教程中文版