前言
本次案例实现目标
- 书籍基本数据
- 实现可视化图表
- 书籍评论数据
- 评论可以实现词云图
最基本思路流程: <通用>
一. 数据来源分析
- 只有当你知道你想要数据内容, 是来自于哪里的时候, 才能通过代码请求得到数据
- 打开 F12 开发者工具进行抓包分析
- 通过关键字进行搜索查询 数据包是请求那个url地址
二. 代码实现步骤过程: 代码实现基本四大步骤
- 发送请求, 模拟浏览器对于url地址<刚刚分析得到的url地址>发送请求
- 获取数据, 获取服务器返回响应数据 —> 开发者工具里面 response
- 解析数据, 提取我们想要的数据内容 —> 书籍基本信息
- 保存数据, 把数据内容保存到表格里面
代码实现
获取书籍详情信息
发送请求
url = f'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
解析数据
selector = parsel.Selector(response.text)
lis = selector.css('.bang_list_mode li')
for li in lis:
title = li.css('.name a::attr(title)').get()
recommend = li.css('.tuijian::text').get().replace('推荐', '')
star = li.css('.star a::text').get().replace('条评论', '')
author = li.css('div:nth-child(5) a:nth-child(1)::attr(title)').get()
date = li.css('div:nth-child(6) span::text').get()
press = li.css('div:nth-child(6) a::text').get()
price_r = li.css('.price .price_r::text').get()
price_n = li.css('.price .price_n::text').get()
price_e = li.css('.price_e span::text').get()
href = li.css('.name a::attr(href)').get()
dit = {
'标题': title,
'推荐': recommend,
'评价': star,
'作者': author,
'出版日期': date,
'出版社': press,
'原价': price_r,
'售价': price_n,
'电子书价格': price_e,
'详情页': href,
}
csv_writer.writerow(dit)
print(dit)
保存数据
f = open('书籍.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'推荐',
'评价',
'作者',
'出版日期',
'出版社',
'原价',
'售价',
'电子书价格',
'详情页',
])
csv_writer.writeheader()
运行代码得到结果
可视化图表
书籍总体价格区间
pie1 = (
Pie(init_opts=opts.InitOpts(theme='dark',width='1000px',height='600px'))
.add('', datas_pair_1, radius=['35%', '60%'])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
.set_global_opts(
title_opts=opts.TitleOpts(
title="当当网书籍\n\n原价价格区间",
pos_left='center',
pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(
color='#F0F8FF',
font_size=20,
font_weight='bold'
),
)
)
.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34', '#D8BFD8', '#00BFFF', '#7FFFAA'])
)
pie1.render_notebook()
pie1 = (
Pie(init_opts=opts.InitOpts(theme='dark',width='1000px',height='600px'))
.add('', datas_pair_2, radius=['35%', '60%'])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
.set_global_opts(
title_opts=opts.TitleOpts(
title="当当网书籍\n\n售价价格区间",
pos_left='center',
pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(
color='#F0F8FF',
font_size=20,
font_weight='bold'
),
)
)
.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34', '#D8BFD8', '#00BFFF', '#7FFFAA'])
)
pie1.render_notebook()
各个出版社书籍数量柱状图
bar=(
Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark'))
.add_xaxis(counts.index.tolist())
.add_yaxis(
'出版社书籍数量',
counts.values.tolist(),
label_opts=opts.LabelOpts(is_show=True,position='top'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""new echarts.graphic.LinearGradient(
0, 0, 0, 1,[{offset: 0,color: 'rgb(255,99,71)'}, {offset: 1,color: 'rgb(32,178,170)'}])
"""
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title='各个出版社书籍数量柱状图'),
xaxis_opts=opts.AxisOpts(name='书籍名称',
type_='category',
axislabel_opts=opts.LabelOpts(rotate=90),
),
yaxis_opts=opts.AxisOpts(
name='数量',
min_=0,
max_=29.0,
splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))
),
tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')
)
.set_series_opts(
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='average',name='均值'),
opts.MarkLineItem(type_='max',name='最大值'),
opts.MarkLineItem(type_='min',name='最小值'),
]
)
)
)
bar.render_notebook()
电子书版本占比
c = (
Liquid()
.add("lq", [1-per], is_outline_show=False)
.set_global_opts(title_opts=opts.TitleOpts(title="电子书版本占比"))
)
c.render_notebook()
书籍评论数据
for page in range(1, 11):
time.sleep(1)
url = 'http://product.dangdang.com/index.php'
data = {
'r': 'comment/list',
'productId': '29129370',
'categoryPath': '01.43.79.01.00.00',
'mainProductId': '29129370',
'mediumId': '0',
'pageIndex': page,
'sortType': '1',
'filterType': '1',
'isSystem': '1',
'tagId': '0',
'tagFilterCount': '0',
'template': 'publish',
'long_or_short': 'short',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
response = requests.get(url=url, params=data, headers=headers)
html_data = response.json()['data']['list']['html']
content_list = re.findall("<span><a href=.*?' target='_blank'>(.*?)</a></span>", html_data)
with open('评论.txt', mode='a', encoding='utf-8') as f:
f.write('\n'.join(content_list))
f.write('\n')
print(content_list)
词云
import jieba
import wordcloud
import imageio
img = imageio.imread('123.png')
f = open('评论.txt', mode='r', encoding='utf-8')
txt = f.read()
txt_list = jieba.lcut(txt)
string = ' '.join(txt_list)
wc = wordcloud.WordCloud(
width=800,
height=500,
background_color='white',
mask=img,
font_path='msyh.ttc',
scale=15,
stopwords={'了', '的'},
contour_width=5,
contour_color='red'
)
wc.generate(string)
wc.to_file('output2.png')
👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇
|