总字符数: 1.96K

代码: 1.74K, 文本: 0.07K

预计阅读时间: 8 分钟

导入模块

1
2
3
4
5
6
7
import requests 
import re
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from lxml import html
etree = html.etree

网站分析

中关村并没有用动态数据加载这里就直接爬取好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def get_articles_list():
title_list = []
price_list = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}
url = 'http://top.zol.com.cn/compositor/57/cell_phone.html'
page = requests.get(url, headers=headers).text
page_text = etree.HTML(page)
li_list = page_text.xpath(
'//div[@class="rank-list"]/div')#分析出包含手机名称以及价格的子div
for li in li_list:
title = li.xpath('./div[3]/div[1]/a/text()')#分析出手机名称
price = li.xpath('./div[4]/div/text()')#手机价格
for t, p in zip(title, price):#循环遍历出手机价格的字符串
t = re.sub(r"[\uFF08-\uFF09].*[\uFF08-\uFF09]", "", t)#利用正则表达式将手机名称中全角括号包括括号中的内容去掉
if p != '概念产品':#如果手机价格不等于概念产品就将其添加到list中
title_list.append(t)
p = p[1:len(p)]#截取去掉原本带着的¥符号
price_list.append(int(p))
else:#等于概念产品就将价格改为99999方便后期做柱状图
p = 99999999
title_list.append(t)
price_list.append(p)
return title_list, price_list

利用matplotlib将数据生成柱状图

1
2
3
4
5
6
7
8
9
10
11
12
if __name__ == "__main__":
title_list, price_list = get_articles_list()
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus'] = False # 正常显示负号
get_articles_list()#运行get_articles_list函数
plt.ylabel('价格')#y轴标题
plt.xlabel("品牌")#x轴标题
x = np.array(title_list[0:8])#选取前8个对其可视化
y = np.array(price_list[0:8])#选取前8个对其可视化
plt.bar(x, y)#设置x,y轴
plt.show()#显示图形

效果图