https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA&pvid=8858151673f941e9b1a4d2c7214b2b52 在京东商城,爬取某个品牌的手机型号、店铺名称、价格和评论条数,存储的CSV文件中。1、按照店铺名称计算该品牌手机的均价,利用饼状图呈现店铺名称和手机均价的关系。2、将该品牌手机,评论前10的手机型号和评论数量用柱状图展示出来。
时间: 2024-04-06 16:34:52 浏览: 173
好的,以下是实现以上功能的代码:
```python
import requests
from bs4 import BeautifulSoup
import csv
import matplotlib.pyplot as plt
# 发送请求获取页面内容
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return None
# 解析页面内容,获取手机信息
def parse_html(html, brand):
soup = BeautifulSoup(html, 'lxml')
items = soup.select('li.gl-item')
data = []
for item in items:
try:
name = item.select_one('div.p-name em').text.strip()
shop = item.select_one('div.p-shop span').text.strip()
price = item.select_one('div.p-price strong i').text.strip()
comment = item.select_one('div.p-commit strong').text.strip()
except:
continue
if brand in name:
data.append([name, shop, price, comment])
return data
# 将数据存储到CSV文件中
def save_to_csv(data, filename):
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['手机型号', '店铺名称', '价格', '评论条数'])
writer.writerows(data)
# 统计每个店铺的均价
def calc_average_price(data):
prices = {}
for item in data:
shop = item[1]
price = float(item[2])
if shop in prices:
prices[shop].append(price)
else:
prices[shop] = [price]
avg_prices = {}
for shop, price_list in prices.items():
avg_price = round(sum(price_list) / len(price_list), 2)
avg_prices[shop] = avg_price
return avg_prices
# 饼状图展示店铺名称和手机均价的关系
def plot_pie_chart(data):
avg_prices = calc_average_price(data)
labels = list(avg_prices.keys())
values = list(avg_prices.values())
fig, ax = plt.subplots(figsize=(8, 8))
ax.pie(values, labels=labels, autopct='%1.1f%%')
ax.set_title('各店铺手机均价占比')
plt.show()
# 柱状图展示评论前10的手机型号和评论数量
def plot_bar_chart(data):
data.sort(key=lambda x: int(x[3]), reverse=True)
top_10 = data[:10]
names = [item[0] for item in top_10]
counts = [int(item[3]) for item in top_10]
fig, ax = plt.subplots(figsize=(12, 6))
ax.bar(names, counts)
ax.set_title('评论前10的手机型号和评论数量')
plt.xticks(rotation=90)
plt.show()
if __name__ == '__main__':
url = 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA&pvid=8858151673f941e9b1a4d2c7214b2b52'
brand = '华为' # 替换成你要爬取的品牌
html = get_html(url)
data = parse_html(html, brand)
save_to_csv(data, 'phones.csv')
plot_pie_chart(data)
plot_bar_chart(data)
```
其中,`get_html` 函数用来发送请求获取页面内容,`parse_html` 函数用来解析页面内容获取手机信息,`save_to_csv` 函数用来将数据存储到 CSV 文件中,`calc_average_price` 函数用来统计每个店铺的均价,`plot_pie_chart` 函数用来绘制饼状图展示店铺名称和手机均价的关系,`plot_bar_chart` 函数用来绘制柱状图展示评论前10的手机型号和评论数量。
在运行程序后,你将会得到一个名为 `phones.csv` 的 CSV 文件,其中包含了你要爬取的品牌的手机型号、店铺名称、价格和评论条数。同时,程序还将会绘制出两个图表,一个是饼状图展示店铺名称和手机均价的关系,另一个是柱状图展示评论前10的手机型号和评论数量。
阅读全文