码迷,mamicode.com
首页 > 其他好文 > 详细

百度热搜数据爬取及分析

时间:2020-04-19 16:24:21      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:提取   分布   use   ict   题目   自己   列表   text   坐标   

一、网络爬虫设计方案

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

 

 

 

 

百度热搜数据爬取及分析

标签:提取   分布   use   ict   题目   自己   列表   text   坐标   

原文地址:https://www.cnblogs.com/l1234/p/12731996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!