一、网络爬虫设计方案
1、爬虫名称:百度汽车热搜
2、内容:爬取百度不同汽车的热搜指数
3、概述:首先查找源代码,分析请求方式和url地址,再使用requests模块获取网页源代码,再使用BeautifulSoup解析得到所需要的数据,然后使用matplotlib实现数据可视化分析,最后进行小结。
难点:回归直线
二、主题页面的结构特征分析
1.主题页面的结构与特征分析
获取电动汽车、小型汽车、中级车、豪华车、SUV这五类汽车每一类的前五名的热搜车型和其对应的指数。
2.Htmls页面解析
三、网络爬虫程序设计
1.数据爬取与采集
对数据进行清洗和处理
.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元)
数据持久化
四、结论:人们对大多喜欢中级车,且SUV类型较多。
小结:经过这次作业,加强了自己对旧知识的掌握以及部分新知识的学习,认识到自己在Python方面还有许多不足。
源代码:
\'\'\' 获取百度汽车热搜数据 \'\'\' import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib import matplotlib.pyplot as plt import re import numpy as np from sklearn.linear_model import LinearRegression # 设置matplotlib正常显示中文和负号 matplotlib.rcParams[\'font.sans-serif\'] = [\'SimHei\'] matplotlib.rcParams[\'axes.unicode_minus\'] = False # 定义一个字典方便构造url地址 car_type_dic = {\'电动汽车\':1676,\'小型车\':1544,\'中级车\':1545,\'豪华车\':1548,\'SUV汽车\':1542} # 获取数据 def get_data(): # 定义一个空的dataFrame df = pd.DataFrame(columns=[\'类型\', \'排名\', \'名称\', \'热搜指数\']) # 设置请求头 headers = { \'User-Agent\': \'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/69.0.3497.100 Safari/537.36\'} # 伪装爬虫 # 遍历字典,循环发送请求 for key, value in car_type_dic.items(): #构建url地址 url = "http://top.baidu.com/buzz?b="+str(value)+"&c=18" #发送请求 r = requests.get(url, headers=headers) #获取网页源代码 html = r.text #对代码进行编码解码,才能正常显示中文 html = html.encode(\'iso-8859-1\').decode(\'gbk\') #调用bs4解析代码 soup = BeautifulSoup(html, "html.parser") all_data = soup.find_all(\'tr\') # print(all_data) for each_topic in all_data: # 排名 car_rank = each_topic.find(\'td\',class_=\'first\') # 标题目 car_name = each_topic.find(\'td\', class_=\'keyword\') # 索指数 car_index = each_topic.find(\'td\', class_=\'last\') # print(car_name,car_rank,car_index) #判断不能为空数据 if car_rank != None and car_name != None and car_index != None: # 利用正则表达式提取数据 # 排名 car_rank = int(re.findall(\'\d+\', car_rank.get_text())[0]) #汽车名 car_name = car_name.get_text().replace(\'search\', \'\').replace(\'\n\', \'\') # 热搜 car_index = int(re.findall(\'\d+\', car_index.get_text())[0]) #数据存储 df = df.append([{\'排名\':car_rank,\'名称\':car_name,\'热搜指数\':car_index,\'类型\':key}]) # 数据持久化存储 df.to_excel(\'data.xlsx\',index=False) return df #画出每个类型前十名热搜平均值的柱状图 def mean_plt(df): #平均值列表 mean_list = [] type_list = df[\'类型\'].unique() for i in type_list: # 取出每个类型前十名的热搜指数 top_ten_data = df.loc[(df[\'排名\'] < 10) & (df[\'类型\'] == i)][\'热搜指数\'] #求平均值 mean_data = top_ten_data.mean() mean_list.append(mean_data) # 生成画布 plt.figure(figsize=(10, 4), dpi=80) # 横坐标汽车类型 type_name = type_list x = range(len(type_name)) plt.bar(x, mean_list, width=0.5, color=[\'b\', \'r\', \'g\', \'y\', \'c\']) # 设置行对应的汽车类型 plt.xticks(x, type_name) # x轴标注 plt.xlabel(\'汽车类型\') # y轴标注 plt.ylabel(\'汽车类型平均热搜指数\') # 图例 plt.legend() # 保存图片 plt.savefig(\'mean.png\') #显示 plt.show() # 画出电动汽车的折线图 def data_plt(df): #构造行 x = [i for i in range(9)] # 列数据 y = df.loc[(df[\'排名\'] < 10) & (df[\'类型\'] == \'电动汽车\')][\'热搜指数\'] # print(x) # print(y) plt.plot(x, y, lw=1, c=\'red\', marker=\'s\', ms=4, label=\'电动汽车折线图\') # x轴的刻度 plt.xticks(x) # x轴标注 plt.xlabel(\'电动汽车排名\') # y轴标注 plt.ylabel(\'电动汽车热搜指数\') # 图例 plt.legend() # 保存图片 plt.savefig(\'data.png\') #显示 plt.show() # 回归方程 def reg_plt(df): # x 为排名 x = np.asarray(df.loc[df[\'类型\'] == \'SUV汽车\'][\'排名\'].values).reshape(-1, 1) # y为 热搜数据 y = np.asarray(df.loc[df[\'类型\'] == \'SUV汽车\'][\'热搜指数\'].values).reshape(-1, 1) # 调用函数进行训练 reg = LinearRegression() reg = reg.fit(x, y) # 打印方程 print("一元回归方程为: Y = %.5fX + (%.5f)" % (reg.coef_[0][0], reg.intercept_[0])) plt.scatter(x, y, color=\'black\') # 画图 plt.plot(x, reg.predict(x), color=\'red\', linewidth=1) # x轴标注 plt.xlabel(\'SUV汽车排名\') # y轴标注 plt.ylabel(\'SUV汽车热搜指数\') # 图例 plt.legend() plt.show() # 函数入口 def main(): # 获取数据 df = get_data() # 折线图 data_plt(df) # 柱状图 mean_plt(df) # 散点图 和 一元线性回归方程 reg_plt(df) main()