百度热搜数据爬取及分析

一、网络爬虫设计方案

1、爬虫名称:百度汽车热搜

2、内容:爬取百度不同汽车的热搜指数

3、概述:首先查找源代码,分析请求方式和url地址,再使用requests模块获取网页源代码,再使用BeautifulSoup解析得到所需要的数据,然后使用matplotlib实现数据可视化分析,最后进行小结。

难点:回归直线

二、主题页面的结构特征分析
1.主题页面的结构与特征分析

获取电动汽车、小型汽车、中级车、豪华车、SUV这五类汽车每一类的前五名的热搜车型和其对应的指数。


2.Htmls页面解析


三、网络爬虫程序设计
1.数据爬取与采集


对数据进行清洗和处理

 


.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)

 

 

.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元)

 

 

数据持久化

 

 

 四、结论:人们对大多喜欢中级车,且SUV类型较多

小结:经过爬虫学习后,加强了自己requestsmatplot的掌握,和对sklearn的了解

源代码:

'''
获取百度汽车热搜数据

'''
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()

 

猜你喜欢

转载自www.cnblogs.com/l1234/p/12731996.html