经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
什么品种的猫最受欢迎?Python爬取猫咪网站交易数据
来源:cnblogs  作者:松鼠爱吃饼干  时间:2021/2/18 15:43:14  对本文有异议

本篇文章是关于某化妆品企业的销售分析。从分析思路开始带大家一步步地用python进行分析,找出问题,并提出解决方案的整个流程。

以下文章来源于修炼Python

作者:叶庭云

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

  1. https://space.bilibili.com/523606542

 

一、前言

看到可爱的猫咪表情包,总是会忍不住收藏,晒部分图如下:

 

认识的一些朋友也养了猫,比如橘猫、英短、加菲猫之类的,看他们发朋友圈撸猫,老羡慕了,猫咪真的太可爱啦。发现一个专门交易猫猫的网站—猫猫交易网可以云看猫:http://www.maomijiaoyi.com/

 

从这个网站里爬取了猫猫品种介绍的数据,以及 20W+ 条猫猫交易数据,以此来了解一下可爱的猫咪。

二、数据获取

打开猫猫交易网,先爬取猫咪品种数据,打开页面可以看到猫猫品种列表:

 

但只显示了每种猫猫的品种名,参考价格,点进详情页,可以看到更加详细的数据:品种名、参考价格、中文学名、基本信息、性格特点、生活习性、优缺点、喂养方法等。

 

检查网页,可以发现网页结构简单,容易解析和提取数据。爬虫代码如下:

  1. import requests
  2. import re
  3. import csv
  4. from lxml import etree
  5. from tqdm import tqdm
  6. from fake_useragent import UserAgent
  7. # 随机产生请求头
  8. ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
  9. def random_ua(): # 用于随机切换请求头
  10. headers = {
  11. "Accept-Encoding": "gzip",
  12. "Accept-Language": "zh-CN",
  13. "Connection": "keep-alive",
  14. "Host": "www.maomijiaoyi.com",
  15. "User-Agent": ua.random
  16. }
  17. return headers
  18. def create_csv(): # 创建保存数据的csv
  19. with open('./data/cat_kind.csv', 'w', newline='', encoding='utf-8') as f:
  20. wr = csv.writer(f)
  21. wr.writerow(['品种', '参考价格', '中文学名', '别名', '祖先', '分布区域',
  22. '原产地', '体型', '原始用途', '今日用途', '分组', '身高',
  23. '体重', '寿命', '整体', '毛发', '颜色', '头部', '眼睛',
  24. '耳朵', '鼻子', '尾巴', '胸部', '颈部', '前驱', '后驱',
  25. '基本信息', 'FCI标准', '性格特点', '生活习性', '优点/缺点',
  26. '喂养方法', '鉴别挑选'])
  27. def scrape_page(url1): # 获取HTML网页源代码 返回文本
  28. response = requests.get(url1, headers=random_ua())
  29. # print(response.status_code)
  30. response.encoding = 'utf-8'
  31. return response.text
  32. def get_cat_urls(html1): # 获取每个品种猫咪详情页url
  33. dom = etree.HTML(html1)
  34. lis = dom.xpath('//div[@class="pinzhong_left"]/a')
  35. cat_urls = []
  36. for li in lis:
  37. cat_url = li.xpath('./@href')[0]
  38. cat_url = 'http://www.maomijiaoyi.com' + cat_url
  39. cat_urls.append(cat_url)
  40. return cat_urls
  41. def get_info(html2): # 爬取每个品种猫咪详情页里的有关信息
  42. # 品种
  43. kind = re.findall('div class="line1">.*?<div class="name">(.*?)<span>', html2, re.S)[0]
  44. kind = kind.replace('\r','').replace('\n','').replace('\t','')
  45. # 参考价格
  46. price = re.findall('<div>参考价格:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  47. price = price.replace('\r', '').replace('\n', '').replace('\t', '')
  48. # 中文学名
  49. chinese_name = re.findall('<div>中文学名:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  50. chinese_name = chinese_name.replace('\r', '').replace('\n', '').replace('\t', '')
  51. # 别名
  52. other_name = re.findall('<div>别名:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  53. other_name = other_name.replace('\r', '').replace('\n', '').replace('\t', '')
  54. # 祖先
  55. ancestor = re.findall('<div>祖先:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  56. ancestor = ancestor.replace('\r', '').replace('\n', '').replace('\t', '')
  57. # 分布区域
  58. area = re.findall('<div>分布区域:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  59. area = area.replace('\r', '').replace('\n', '').replace('\t', '')
  60. # 原产地
  61. source_area = re.findall('<div>原产地:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  62. source_area = source_area.replace('\r', '').replace('\n', '').replace('\t', '')
  63. # 体型
  64. body_size = re.findall('<div>体型:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  65. body_size = body_size.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  66. # 原始用途
  67. source_use = re.findall('<div>原始用途:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  68. source_use = source_use.replace('\r', '').replace('\n', '').replace('\t', '')
  69. # 今日用途
  70. today_use = re.findall('<div>今日用途:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  71. today_use = today_use.replace('\r', '').replace('\n', '').replace('\t', '')
  72. # 分组
  73. group = re.findall('<div>分组:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  74. group = group.replace('\r', '').replace('\n', '').replace('\t', '')
  75. # 身高
  76. height = re.findall('<div>身高:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  77. height = height.replace('\r', '').replace('\n', '').replace('\t', '')
  78. # 体重
  79. weight = re.findall('<div>体重:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  80. weight = weight.replace('\r', '').replace('\n', '').replace('\t', '')
  81. # 寿命
  82. lifetime = re.findall('<div>寿命:</div>.*?<div>(.*?)</div>', html2, re.S)[0]
  83. lifetime = lifetime.replace('\r', '').replace('\n', '').replace('\t', '')
  84. # 整体
  85. entirety = re.findall('<div>整体</div>.*?<!-- 页面小折角 -->.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  86. entirety = entirety.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  87. # 毛发
  88. hair = re.findall('<div>毛发</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  89. hair = hair.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  90. # 颜色
  91. color = re.findall('<div>颜色</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  92. color = color.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  93. # 头部
  94. head = re.findall('<div>头部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  95. head = head.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  96. # 眼睛
  97. eye = re.findall('<div>眼睛</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  98. eye = eye.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  99. # 耳朵
  100. ear = re.findall('<div>耳朵</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  101. ear = ear.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  102. # 鼻子
  103. nose = re.findall('<div>鼻子</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  104. nose = nose.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  105. # 尾巴
  106. tail = re.findall('<div>尾巴</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  107. tail = tail.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  108. # 胸部
  109. chest = re.findall('<div>胸部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  110. chest = chest.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  111. # 颈部
  112. neck = re.findall('<div>颈部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  113. neck = neck.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  114. # 前驱
  115. font_foot = re.findall('<div>前驱</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  116. font_foot = font_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  117. # 后驱
  118. rear_foot = re.findall('<div>前驱</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]
  119. rear_foot = rear_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()
  120. # 保存前面猫猫的各种有关信息
  121. cat = [kind, price, chinese_name, other_name, ancestor, area, source_area,
  122. body_size, source_use, today_use, group, height, weight, lifetime,
  123. entirety, hair, color, head, eye, ear, nose, tail, chest, neck, font_foot, rear_foot]
  124. # 提取标签栏信息(基本信息-FCI标准-性格特点-生活习性-优缺点-喂养方法-鉴别挑选)
  125. html2 = etree.HTML(html2)
  126. labs = html2.xpath('//div[@class="property_list"]/div')
  127. for lab in labs:
  128. text1 = lab.xpath('string(.)')
  129. text1 = text1.replace('\n','').replace('\t','').replace('\r','').replace(' ','')
  130. cat.append(text1)
  131. return cat
  132. def write_to_csv(data): # 保存数据 追加写入
  133. with open('./data/cat_kind.csv', 'a+', newline='', encoding='utf-8') as fn:
  134. wr = csv.writer(fn)
  135. wr.writerow(data)
  136. if __name__ == '__main__':
  137. # 创建保存数据的csv
  138. create_csv()
  139. # 猫咪品种页面url
  140. base_url = 'http://www.maomijiaoyi.com/index.php?/pinzhongdaquan_5.html'
  141. # 获取品种页面中的所有url
  142. html = scrape_page(base_url)
  143. urls = get_cat_urls(html)
  144. # 进度条可视化运行情况 就不打印东西来看了
  145. pbar = tqdm(urls)
  146. # 开始爬取
  147. for url in pbar:
  148. text = scrape_page(url)
  149. info = get_info(text)
  150. write_to_csv(info)

 

运行效果如下:

 

成功爬取了猫咪品种数据保存到csv,接下来爬取猫猫交易数据,进入到买猫卖猫页面:

 

爬取更详细的数据需要进入详情页,包含商家信息、猫咪品种、猫龄、价格、标题、在售只数、预防等信息。

 

由于数据量较大,可以分开爬取,先获取到每一页中的所有猫猫详情交易链接的 url 保存到csv,再读取 csv 中的 url 来请求,爬取每条交易数据,爬虫思路跟前面类似,为了加快爬取效率,可以使用多线程或者异步爬虫。最终获取了 20W+ 条数据。

三、数据探索

通过词云图来直观看一下,可爱的猫咪都有那些品种。

 

看各种猫咪的体型分布

 

所有品种的猫咪里,大型的只有一个品种,是布偶猫,其他品种都是中小型,那以后看见体型比较大的,可以先想到布偶猫。

 

橘猫是世界各地都有的,不愧是我大橘猫。俗话说 "十个橘猫九个胖还有一个压塌炕"。橘猫比起其他花色的猫咪更喜欢吃东西,它们的食欲很好,能更好地生存,可能这也是橘猫在世界范围都有的原因吧。可它却是小型猫,橘猫小时候颜值一般挺高,看起来小小的一只,又嫩又可爱的,但等橘猫长大以后,才真正地意识到什么是 "橘足轻重"。

 

下面来看猫咪的交易数据,在交易的猫咪中,哪些品种交易数量最多呢?

 

橘猫的交易数量最多呀,之前也提到橘猫世界各地都有,从这里也可以看到橘猫数量最多。其次是咖啡猫,布偶猫,英短蓝白猫等。

 

缅因猫、布偶猫均价名列前茅啊,橘猫的均价排倒数第二,看来挺实惠。

这些售卖的猫咪猫龄一般为多大呢?

 

售卖的猫咪猫龄主要在1-6个月,都是刚出生还未满半岁的小猫咪呀。这时候的小猫咪应该很可爱吧,等待有缘的主人把它带回家。

最后来看一下网站里价格最贵的猫咪和浏览次数最多的猫咪

  1. import pandas as pd
  2. df = pd.read_excel('处理后数据.xlsx')
  3. print(df.info())
  4. df1 = df.sort_values(by='浏览次数', ascending=False)
  5. print(df1.iloc[:3, ::].values)
  6. print('----------------------------------------------------------')
  7. df2 = df.sort_values(by='价格', ascending=False)
  8. print(df2.iloc[:3, ::].values)
  9. # 浏览次数最多的
  10. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_441879.html
  11. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_462431.html
  12. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_455366.html

 

 

浏览次数最多的是这一家卖的缅因猫,浏览次数为16164。emmm,感觉这种猫咪看着还挺凶的,不怎么可爱。

 

 

反观浏览次数排第二、第三的,价格便宜不少,预防都打了3针疫苗,在售只数还比较充裕,还比第一可爱好多(个人感觉)。

  1. # 价格最贵的如下
  2. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_265770.html
  3. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_281910.html
  4. http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_230417.html

 

 

 

 

价格最贵的发现均为 3000 元的布偶猫。查阅资料发现,布偶猫,大型猫咪,不仅购买的时候价格高昂,饲养成本也比较高,因为食量和运动量都比较大,而且美容等相关费用也会高一些。

原文链接:http://www.cnblogs.com/hhh188764/p/14382972.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号