爬取百度热搜榜并把数据可视化
1.目标爬取百度热搜榜(百度热搜榜网址:https://top.baidu.com)
2.对爬取的数据进行清洗和分析
爬取网站的“关键词”“相关链接”“搜索指数”
3.进行数据可视化
实现思路:1.到该网页使用f12查看源代码,查找所要爬取的数据。
2.使用get或post进行数据爬取。
3.提取有用的数据。
4.使用pandas库将数据转化为二维表。
5.使用pandas库进行数据的清洗
6.使用matplotlib库进行数据可视化。
技术难点:爬取数据以及对数据的转化。
1.源代码
URL:http://top.baidu.com.
2爬取代码如下
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy.optimize import leastsq
import requests2020-04-2420:57:32
from bs4 import BeautifulSoup
import pandas as pd
import csv
import jieba
import wordcloud
import requests
from lxml import etree
head = {}
url = "http://top.baidu.com/buzz?b=341&fr=topindex
head["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
head["Accept"]= "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
head["Accept-Language"]= "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
head["Connection"] = "keep-alive"
def main():
print("百度热搜top:
res = requests.get(url , headers = head)
with open("html.txt", "wb") as f:
f.write(res.content)
html = etree.parse('html.txt' , etree.HTMLParser(encoding='gbk')
top_list = html.xpath('//a[@class="list-title"]/text()'
num_search = html.xpath('//span[@class="icon-rise"]/text()'
for i , j in zip(top_list[:10] , num_search[:10]):
print(i ,"搜索指数为:" , j )
if __name__ == '__main__'
main()
对数据进行清洗:
1 import pandas as pd 2 kugou=pd.DataFrame(pd.read_excel('data.xls')) 3 kugou.head() 4 kugou.drop(1,axis=0,inplace=True) 5 kugou.head()
一元方程:
import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x=['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [1,2,3,4,5,6,7,8,9,10] plt.plot(x,y) plt.xlabel("标题") plt.ylabel("排名") plt.title('Top10热点') plt.show()
柱状图:
plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"], [10192583,8282019,6259729,3204900,2272270,2109700,1603809,1108235,1098635,1004177]) plt.legend() plt.xlabel("热搜事件") plt.ylabel("热度指数") plt.title('Top10热点') plt.show()
散点图:
def Scatter_point(): x = ['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [1,2,3,4,5,6,7,8,9,10] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("热度") plt.title("热搜事件与热度散点图") plt.show() Scatter_point()
折线图:
def line_diagram(): x = ['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [10192583,8282019,6259729,3204900,2272270,2109700,1603809,1108235,1098635,1004177] plt.xlabel('事件') plt.ylabel('热度') plt.plot(x,y) plt.scatter(x,y) plt.title("热搜事件与热度折线图") plt.show() line_diagram()
最后汇总部分代码,并附上完整代码:
import requests from lxml import etree head = {} url = "http://top.baidu.com/buzz?b=341&fr=topindex" head["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0" head["Accept"]= "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" head["Accept-Language"]= "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" head["Connection"] = "keep-alive" def main(): print("百度热搜top: ") res = requests.get(url , headers = head) with open("html.txt", "wb") as f: f.write(res.content) html = etree.parse('html.txt' , etree.HTMLParser(encoding='gbk')) top_list = html.xpath('//a[@class="list-title"]/text()') num_search = html.xpath('//span[@class="icon-rise"]/text()') for i , j in zip(top_list[:10] , num_search[:10]): print(i ,"搜索指数为:" , j ) if __name__ == '__main__': main() import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x=['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [1,2,3,4,5,6,7,8,9,10] plt.plot(x,y) plt.xlabel("标题") plt.ylabel("排名") plt.title('Top10热点') plt.show() plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] plt.bar(['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"], [10192583,8282019,6259729,3204900,2272270,2109700,1603809,1108235,1098635,1004177]) plt.legend() plt.xlabel("热搜事件") plt.ylabel("热度指数") plt.title('Top10热点') plt.show() def Scatter_point(): x = ['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [1,2,3,4,5,6,7,8,9,10] plt.scatter(x,y,color='pink', s=25, marker="o") plt.xlabel("事件") plt.ylabel("热度") plt.title("热搜事件与热度散点图") plt.show() Scatter_point() def line_diagram(): x = ['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [10192583,8282019,6259729,3204900,2272270,2109700,1603809,1108235,1098635,1004177] plt.xlabel('事件') plt.ylabel('热度') plt.plot(x,y) plt.scatter(x,y) plt.title("热搜事件与热度折线图") plt.show() line_diagram() import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] x=['瑞幸咖啡门店爆单','清明节全国哀悼','瑞幸咖啡暴跌熔断','欧盟向意大利道歉','特朗普痛批3M公司','武汉解封倒计时','南海首次发现鲸落',"俄罗斯新增440例","广州公交车撞隧道","疫情高风险国家"] y = [1,2,3,4,5,6,7,8,9,10] plt.plot(x,y) plt.xlabel("标题") plt.ylabel("排名") plt.title('Top10热点') plt.show()
结论:通过此次Python作业,我感受到了Python语言的强大魅力,发现它比其他语言更容易上手,相对比较简单。
总结:完成这次作业后,我发现了自己在Python中知识的缺漏,也因为这些缺漏导致一些作业要求我实在无法完成,所以我一定在今后的Python学习中多学多问,增长自己的见识,弥补自己的不足。