python教程網(wǎng)絡(luò)爬蟲及數(shù)據(jù)可視化原理解析
1 項目背景
1.1Python的優(yōu)勢
Python有成熟的程序包資源庫和活躍的社區(qū) Python以PYPI為技術(shù)支撐,資源豐富,可被靈活調(diào)用。還有一些其他優(yōu)勢,比如跨平臺且開源、成本??;可方便快捷實現(xiàn)數(shù)據(jù)可視化,像2D圖表和一些基本的3D 圖表可以借matplotlib和 seaborn等等一些專屬庫,只需要編寫簡單的Python代碼就可輸出可視化結(jié)果,方便快捷[1]。
1.2網(wǎng)絡(luò)爬蟲
網(wǎng)絡(luò)爬蟲(Web Crawler)是依照一定規(guī)則主動抓取網(wǎng)頁的程序,是搜索引擎獲得信息的渠道之一。通常根據(jù)給定 URL 種子爬取網(wǎng)頁,得到新的 URL 存放至待爬行 URL中,當(dāng)滿足一定條件時停止爬行。網(wǎng)絡(luò)爬蟲一般分為通用網(wǎng)絡(luò)爬蟲、深度網(wǎng)絡(luò)爬蟲和主題網(wǎng)絡(luò)爬蟲 3 類。 主題網(wǎng)絡(luò)爬蟲通常給定 URL 種子集,依照預(yù)先規(guī)定的主題,由特定的分析算法算出爬行網(wǎng)頁的主題相關(guān)度,并過濾與主題無關(guān)的網(wǎng)頁,優(yōu)先抓取相關(guān)度高的網(wǎng)頁,當(dāng)滿足一定條件時停止。主題網(wǎng)絡(luò)爬蟲根據(jù)主題對 Web 進(jìn)行分塊采集并整合采集結(jié)果,從而提高 Web 頁面利用率[2]。
1.3數(shù)據(jù)可視化
在計算機(jī)學(xué)科的分類中,利用人眼的感知能力對數(shù)據(jù)進(jìn)行交互的可視化表達(dá)以增強(qiáng)認(rèn)知的技術(shù),稱為可視化。16 世紀(jì),天體和地理的測量技術(shù)得到發(fā)展, 通過三角測量等技術(shù)可精確繪制地圖,數(shù)據(jù)可視化開始萌芽。20 世紀(jì) 60 年代計算機(jī)的發(fā)展使得數(shù)據(jù)可視化加速發(fā)展,通過計算機(jī)圖像處理等技術(shù),新的可視化方法和技術(shù)迎來爆炸性增長。數(shù)據(jù)可視化將相對復(fù)雜、冗雜的大數(shù)據(jù)經(jīng)過挖掘、轉(zhuǎn)化,提煉出結(jié)構(gòu)化數(shù)據(jù)內(nèi)容,并通過可視的方式以用戶更易理解的形式 展示出來,清晰表達(dá)數(shù)據(jù)內(nèi)在的信息和規(guī)律[3]。
1.4Python環(huán)境介紹
1.4.1簡介
PyCharm是一種Python IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,比如調(diào)試、語法高亮、Project管理、代碼跳轉(zhuǎn)、智能提示、自動完成、單元測試、版本控制。
此外,該IDE提供了一些高級功能,以用于支持Django框架下的專業(yè)Web開發(fā)。同時支持Google App Engine,PyCharm支持IronPython。這些功能在先進(jìn)代碼分析程序的支持下,使 PyCharm 成為 Python 專業(yè)開發(fā)人員和剛起步人員使用的有力工具。
1.4.2特點
首先,PyCharm擁有一般IDE具備的功能,比如, 調(diào)試、語法高亮、Project管理、代碼跳轉(zhuǎn)、智能提示、自動完成、單元測試、版本控制
另外,PyCharm還提供了一些很好的功能用于Django開發(fā),同時支持Google App Engine,更酷的是,PyCharm支持IronPython主要功能
1.5擴(kuò)展庫介紹
1.5.1安裝模塊
1.5.2主要模塊介紹
① pandas
模塊
pandas是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。它納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具,提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法[4]。
pandas中常見的數(shù)據(jù)結(jié)構(gòu)有兩種:
Series DateFrame
類似一維數(shù)組的對象, 類似多維數(shù)組/表格數(shù)組;每列數(shù)據(jù)可以是不同的類型;索引包括列索引和行索引。
② requests
模塊
requests是一常用的http請求庫,它使用python語言編寫,可以方便地發(fā)送http請求,以及方便地處理響應(yīng)結(jié)果。
③ bs4
模塊
BS4 (beautiful soup 4)是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫.它能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式.Beautiful Soup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間.
④ selenium
模塊
selenium 是一套完整的web應(yīng)用程序測試系統(tǒng),包含了測試的錄制(selenium IDE),編寫及運(yùn)行(Selenium Remote Control)和測試的并行處理(Selenium Grid)。selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。
⑤ matplotlib
模塊
matplotlib 是一個 Python 的 2D繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環(huán)境生成出版質(zhì)量級別的圖形。它可與Numpy一起使用,提供一種有效的MATLAB開源替代方案;它也可以和圖形工具包一起使用,讓用戶很輕松地將數(shù)據(jù)圖形化;同時它還提供多樣的輸出格式。
⑥ seaborn
模塊
seaborn是一個在Python中制作有吸引力和豐富信息的統(tǒng)計圖形的庫。它構(gòu)建在MatPultLB的頂部,與PyDATA棧緊密集成,包括對SIMPY和BANDA數(shù)據(jù)結(jié)構(gòu)的支持以及SISPY和STATSMODEL的統(tǒng)計例程。
seaborn 其實是在matplotlib的基礎(chǔ)上進(jìn)行了更高級的 API 封裝,從而使得作圖更加容易 在大多數(shù)情況下使用seaborn就能做出很具有吸引力的圖,而使用matplotlib就能制作具有更多特色的圖。應(yīng)該把Seaborn視為matplotlib的補(bǔ)充。Seabn是基于MatPultLB的Python可視化庫。它為繪制有吸引力的統(tǒng)計圖形提供了一個高級接口。
⑦ pyecharts
模塊
pyecharts 是一個用于生成 Echarts 圖表的類庫。echarts 是百度開源的一個數(shù)據(jù)可視化 JS 庫,主要用于數(shù)據(jù)可視化。pyecharts 是一個用于生成 Echarts 圖表的類庫。實際上就是 Echarts 與 Python 的對接。使用 pyecharts 可以生成獨立的網(wǎng)頁,也可以在 flask , Django 中集成使用。
2需求分析
2.1 網(wǎng)絡(luò)爬蟲需求
通過對爬取網(wǎng)頁的html分析,爬取網(wǎng)頁的數(shù)據(jù),將爬取的數(shù)據(jù)保存到文件,用于對數(shù)據(jù)進(jìn)行可視化。
2.2 數(shù)據(jù)可視化需求
使爬取網(wǎng)站的數(shù)據(jù)用更直觀的效果展示,當(dāng)數(shù)據(jù)獲取完成,我們使用相關(guān)模塊對數(shù)據(jù)進(jìn)行清洗處理,并對數(shù)據(jù)做可視化分析,并理解每一個圖標(biāo)所代表意義;
3總體設(shè)計
3.1 網(wǎng)頁分析
在爬取國家統(tǒng)計局網(wǎng)站上的數(shù)據(jù),需要用到WebDriver,先安裝chromdriver。安裝的Chromedriver要與自己電腦上的谷歌版本號對應(yīng),將下載的chromedriver.exe放到如圖 1圖 2所示路徑下,放到安裝谷歌和安裝python路徑下,用來調(diào)用這個可執(zhí)行文件。還將這兩個路徑添加環(huán)境變量。
驅(qū)動瀏覽器,用webdriver的對象對網(wǎng)頁進(jìn)行點擊等操作,找到想要爬取的網(wǎng)站。
通過對網(wǎng)頁html分析,通過路徑一層層找到自己想要獲取的數(shù)據(jù)。如圖 3所示,將數(shù)據(jù)追加到列表中,保存到文件。
爬取豆瓣電影Top250,翻頁查看url變化規(guī)律:
第一頁:https://movie.douban.com/top250?start=0&filter=
第二頁:https://movie.douban.com/top250?start=25&filter=
第三頁:https://movie.douban.com/top250?start=50&filter=
第十頁:https://movie.douban.com/top250?start=225&filter=
分析可得頁面url的規(guī)律:
url_list = [“https://movie.douban.com/top250?start={}&filter=”.format(x * 25) for x in range(10)]
對網(wǎng)頁進(jìn)行分析,如圖 4所示,每個li標(biāo)簽里都包含每個電影的基本信息,例如:“排名”, “電影名”, "導(dǎo)演和主演"等等。將這些信息追加到列表中,保存到movie.xlsx文件中。
3.2 數(shù)據(jù)可視化設(shè)計
將爬取的數(shù)據(jù)用多種圖表的顯示。例如:條形圖,餅圖,散點圖,箱線圖,玫瑰圖,詞云等形式。利用python的pandas模塊將數(shù)據(jù)文件讀入。導(dǎo)入matplotlib, pyecharts等模塊,調(diào)用模塊畫圖的相應(yīng)函數(shù)。進(jìn)行數(shù)據(jù)可視化,并將可視化結(jié)果保存為圖片。
4方案實施
4.1網(wǎng)絡(luò)爬蟲代碼
import pandas as pd import requests from bs4 import BeautifulSoup import time import re from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import lxml import openpyxl import codecs headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3" } url1 = "https://data.stats.gov.cn/easyquery.htm?cn=E0105" url2 = "http://data.stats.gov.cn" '''爬取近五年主要城市數(shù)據(jù)''' def driver1(url1): driver = webdriver.Chrome() driver.get(url1) time.sleep(3) xRdata = '//*[@id="details-button"]' # 點擊高級 ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform() xRdata = '//*[@id="proceed-link"]' # 點擊 ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform() time.sleep(3) time.sleep(4) # 加載頁面,停留時間長一些 xTable = '//*[@class="table-container"]/div/div[3]/table/tbody' # 主要城市年度數(shù)據(jù)表 table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML') soup = BeautifulSoup(table, 'html.parser') # 解析表單 tb = soup.find_all('tr') # 查找表內(nèi)tr標(biāo)簽 tb_p = [] # 各城市名字 tb_ = [] tb_1 = [[], [], [], [], []] for row in tb: row_text = row.text # 查找第一個數(shù)字的索引 ret1 = re.search('\d', row_text).start() # 將各個城市寫入列表中 tb_p.append(row_text[:ret1]) # 截斷至第一個數(shù)字 row_text = row_text[ret1:] for i in range(5): try: # 順序查找點 ret = row_text.find('.') # 將第一年年數(shù)據(jù)保存到列表中 tb_.append(row_text[:ret + 3]) # 刪去第一年的數(shù)據(jù) row_text = row_text[ret + 3:] except: break for i in range(5): for j in range(i, len(tb_), 5): try: tb_1[i].append(tb_[j]) except: break data = {'地區(qū)': tb_p, '2019年': tb_1[0], '2018年': tb_1[1], '2017年': tb_1[2], '2016年': tb_1[3], '2015年': tb_1[4], } dataframe = pd.DataFrame(data) dataframe.to_csv('City_data.csv', index=False, sep=',', encoding='utf-8-sig') driver.close() '''爬取2019年各省GDP''' def driver2(url2): driver = webdriver.Chrome() driver.get(url2) time.sleep(3) xRdata = '//*[@id="details-button"]' # 點擊高級 ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform() xRdata = '//*[@id="proceed-link"]' # 點擊 ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform() time.sleep(3) xRdata = '//*[@id="nav"]/ul/li[6]/a' # 地區(qū)數(shù)據(jù) ActionChains(driver).click(driver.find_element_by_xpath(xRdata)).perform() time.sleep(3) xPdata = '//*[@id="menuE01"]/li[3]/a' # 分省年度數(shù)據(jù) ActionChains(driver).click(driver.find_element_by_xpath(xPdata)).perform() time.sleep(4) # 加載頁面,停留時間長一些 xTable = '//*[@class="table-container"]/div/div[3]/table/tbody' # 數(shù)據(jù)表 table = driver.find_element_by_xpath(xTable).get_attribute('innerHTML') soup = BeautifulSoup(table, 'html.parser') # 解析表單 tb = soup.find_all('tr') # 查找表內(nèi)tr標(biāo)簽 tb_p = [] # 各省市名字 tb_ = [] tb_1 = [[], [], [], [], [], [], [], [], [], []] for row in tb: row_text = row.text # 查找第一個數(shù)字的索引 ret1 = re.search('\d', row_text).start() # 將各個省份寫入列表中 tb_p.append(row_text[:ret1]) # 截斷至第一個數(shù)字 row_text = row_text[ret1:] for i in range(1): try: # 順序查找點 ret = row_text.find('.') # 將第一年年數(shù)據(jù)保存到列表中 tb_.append(row_text[:ret + 3]) # 刪去第一年的數(shù)據(jù) row_text = row_text[ret + 3:] except: break for i in range(1): for j in range(i, len(tb_), 1): try: tb_1[i].append(tb_[j]) except: break data = {'Province': tb_p, 'GDP': tb_1[0], } dataframe = pd.DataFrame(data) dataframe.to_csv('2019_Province_GDP.csv', index=False, sep=',', encoding='utf-8-sig') driver.close() '''爬取豆瓣電影Top250''' wb = openpyxl.Workbook() # 創(chuàng)建工作簿對象 sheet = wb.active # 獲取工作簿的活動表 sheet.title = "movie" # 工作簿重命名 sheet.append(["排名", "電影名", "導(dǎo)演和主演", "上映時間", "上映地區(qū)", "電影類型", "評分", "評價人數(shù)", "引言"]) def get_movie(urls): rank = 1 for url in urls: res = requests.get(url, headers=headers).text html = lxml.etree.HTML(res) # 先xpath定位提取到每個頁面的所有l(wèi)i標(biāo)簽 lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li') # 每個li標(biāo)簽里有每部電影的基本信息 for li in lis: name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0] director_actor = li.xpath('.//div[@class="bd"]/p/text()')[0].strip() info = li.xpath('.//div[@class="bd"]/p/text()')[1].strip() # 按"/"切割成列表 _info = info.split("/") # 得到 上映時間 上映地區(qū) 電影類型信息去除兩端多余空格 time, area, genres = _info[0].strip(), _info[1].strip(), _info[2].strip() # print(time, area, genres) rating_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0] rating_num = li.xpath('.//div[@class="star"]/span[4]/text()')[0] quote = li.xpath('.//p[@class="quote"]/span/text()') # 最后一頁有部電影 九品芝麻官 沒有一句話引言 加條件判斷 防止報錯 if len(quote) == 0: quote = None else: quote = quote[0] sheet.append([rank, name, director_actor, time, area, genres, rating_score, rating_num, quote]) rank += 1 # 保存到文件 wb.save("movie.xlsx") '''豆瓣電影Top250''' index_url = 'https://movie.douban.com/top250' def get_html(url): html = requests.get(url, headers=headers).text return html def create_list(html): soup = BeautifulSoup(html, 'lxml') movie_names = [] movie_info = [] for t in soup.find_all('div', 'hd'): name = t.find('span', 'title').get_text() movie_names.append(name) for t in soup.find_all('div', 'info'): info = t.find('p').get_text().replace(' ','') movie_info.append(info) next_page = soup.find('span', 'next').find('a') if next_page: return movie_names, movie_info, index_url + next_page['href'] else: return movie_names, movie_info, None def main(): order = 1 url = index_url with codecs.open('top250.txt', 'wb', encoding='utf-8') as f: while url: html = get_html(url) names, info, url = create_list(html) for n in range(25): f.write('Top ' + str(order) + ' ' + names[n] + '\r\n') f.write(info[n] + '\r\n') order = order+1 if __name__ == "__main__": # 列表推導(dǎo)式得到url列表 10頁的電影信息 Top250 url_list = ["https://movie.douban.com/top250?start={}&filter=".format(i * 25) for i in range(10)] driver1(url1) driver2(url2) get_movie(url_list) main()
4.2 數(shù)據(jù)可視化代碼
import pandas as pd import re import matplotlib.pyplot as plt import collections import seaborn as sns from stylecloud import gen_stylecloud import jieba import squarify from pyecharts import Pie sns.set() #恢復(fù)seaborn的默認(rèn)主題 # 中文亂碼和坐標(biāo)軸負(fù)號的處理 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False '''條形圖''' GDP = pd.read_csv('2019_Province_GDP.csv') # 設(shè)置繪圖風(fēng)格 plt.style.use('ggplot') # 繪制條形圖 plt.bar(x= range(GDP.shape[0]), # 指定條形圖x軸的刻度值 height = GDP.GDP, # 指定條形圖y軸的數(shù)值 tick_label = GDP.Province, # 指定條形圖x軸的刻度標(biāo)簽 color = 'steelblue', # 指定條形圖的填充色 ) # 添加y軸的標(biāo)簽 plt.ylabel('GDP(萬億)') # 添加條形圖的標(biāo)題 plt.title('2019年各省份GDP分布') # 為每個條形圖添加數(shù)值標(biāo)簽 for x,y in enumerate(GDP.GDP): plt.text(x,y+0.1,'%s' %round(y,1),ha='center') # 顯示圖形 plt.savefig('test1.png') plt.show() '''餅圖''' # 構(gòu)造數(shù)據(jù) edu = [0.2515,0.3724,0.3336,0.0368,0.0057] labels = ['中專','大專','本科','碩士','其他'] explode = [0,0.1,0,0,0] # 生成數(shù)據(jù),用于突出顯示大專學(xué)歷人群 colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定義顏色 # 將橫、縱坐標(biāo)軸標(biāo)準(zhǔn)化處理,確保餅圖是一個正圓,否則為橢圓 plt.axes(aspect='equal') # 繪制餅圖 plt.pie(x = edu, # 繪圖數(shù)據(jù) explode=explode, # 突出顯示大專人群 labels=labels, # 添加教育水平標(biāo)簽 colors=colors, # 設(shè)置餅圖的自定義填充色 autopct='%.1f%%', # 設(shè)置百分比的格式,這里保留一位小數(shù) pctdistance=0.8, # 設(shè)置百分比標(biāo)簽與圓心的距離 labeldistance = 1.1, # 設(shè)置教育水平標(biāo)簽與圓心的距離 startangle = 180, # 設(shè)置餅圖的初始角度 radius = 1.2, # 設(shè)置餅圖的半徑 counterclock = False, # 是否逆時針,這里設(shè)置為順時針方向 wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 設(shè)置餅圖內(nèi)外邊界的屬性值 textprops = {'fontsize':10, 'color':'black'}, # 設(shè)置文本標(biāo)簽的屬性值 ) # 添加圖標(biāo)題 plt.title('失信用戶的受教育水平分布') # 顯示圖形 plt.savefig('test2.png') plt.show() '''箱線圖''' data=pd.read_csv('City_data.csv') #箱線圖 data.boxplot() plt.savefig('test3.png') plt.show() '''樹地圖''' # 創(chuàng)建數(shù)據(jù) name = ['國內(nèi)增值稅', '國內(nèi)消費(fèi)稅', '企業(yè)所得稅', '個人所得稅', '進(jìn)口增值稅、消費(fèi)稅', '出口退稅', '城市維護(hù)建設(shè)稅', '車輛購置稅', '印花稅', '資源稅', '土地和房稅', '車船稅煙葉稅等'] income = [3908, 856, 801, 868, 1361, 1042, 320, 291, 175, 111, 414, 63] # 繪圖 colors = ['steelblue', '#9999ff', 'red', 'indianred', 'green', 'yellow', 'orange'] plot = squarify.plot(sizes=income, # 指定繪圖數(shù)據(jù) label=name, # 指定標(biāo)簽 color=colors, # 指定自定義顏色 alpha=0.6, # 指定透明度 value=income, # 添加數(shù)值標(biāo)簽 edgecolor='white', # 設(shè)置邊界框為白色 linewidth=3 # 設(shè)置邊框?qū)挾葹? ) # 設(shè)置標(biāo)簽大小 plt.rc('font', size=8) # 設(shè)置標(biāo)題大小 plot.set_title('2020年12月中央財政收支情況', fontdict={'fontsize': 15}) # 去除坐標(biāo)軸 plt.axis('off') # 去除上邊框和右邊框刻度 plt.tick_params(top='off', right='off') # 顯示圖形 plt.savefig('test4.png') plt.show() '''玫瑰圖''' attr =["碳酸飲料", "其他", "綠茶", "礦泉水", "果汁"] v1 =[6, 2, 7, 6,1] v2 =[9, 6, 4, 4,5] pie =Pie("玫瑰圖", title_pos='center', width=800) pie.add("男", attr, v1, center=[25, 50], is_random=True, radius=[20, 50], rosetype='radius') pie.add("女", attr, v2, center=[75, 50], is_random=True, radius=[20, 50], rosetype='area', is_legend_show=False, is_label_show=True) pie.show_config() pie.render('玫瑰圖.html') # 讀取數(shù)據(jù) df = pd.read_excel("movie.xlsx",engine='openpyxl') # print(type(df)) # <class 'pandas.core.frame.DataFrame'> '''上映高分電影數(shù)量最多的年份Top10''' show_time = list(df["上映時間"]) # 有上映時間數(shù)據(jù)是1961(中國大陸)這樣的 處理一下 字符串切片 show_time = [s[:4] for s in show_time] show_time_count = collections.Counter(show_time) # 取數(shù)量最多的前10 得到一個列表 里面每個元素是元組 # (年份, 數(shù)量) show_time_count = show_time_count.most_common(10) # 字典推導(dǎo)式 show_time_dic = {k: v for k, v in show_time_count} # 按年份排序 show_time = sorted(show_time_dic) # 年份對應(yīng)高分電影數(shù)量 counts = [show_time_dic[k] for k in show_time] plt.figure(figsize=(9, 6), dpi=100) # 繪制條形圖 plt.bar(show_time, counts, width=0.5, color="cyan") # y軸刻度重新設(shè)置一下 plt.yticks(range(0, 16, 2)) # 添加描述信息 plt.xlabel("年份") plt.ylabel("高分電影數(shù)量") plt.title("上映高分電影數(shù)量最多的年份Top10", fontsize=15) # 添加網(wǎng)格 網(wǎng)格的透明度 線條樣式 plt.grid(alpha=0.2, linestyle=":") plt.savefig('test5.png') plt.show() '''國家或地區(qū)上榜電影數(shù)量最多的Top10''' area = list(df['上映地區(qū)']) sum_area = [] for x in area: x = x.split(" ") for i in x: sum_area.append(i) area_count = collections.Counter(sum_area) area_dic = dict(area_count) area_count = [(k, v) for k, v in list(area_dic.items())] # 按國家或地區(qū)上榜電影數(shù)量排序 area_count.sort(key=lambda k: k[1]) # 取國家或地區(qū)上榜電影數(shù)量最多的前十 area = [m[0] for m in area_count[-10:]] nums = [m[1] for m in area_count[-10:]] plt.figure(figsize=(9, 6), dpi=100) # 繪制橫著的條形圖 plt.barh(area, nums, color='red') # 添加描述信息 plt.xlabel('電影數(shù)量') plt.title('國家或地區(qū)上榜電影數(shù)量最多的Top10') plt.savefig('test6.png') plt.show() '''豆瓣電影Top250-評價人數(shù)Top10''' name = list(df['電影名']) ranting_num = list(df['評價人數(shù)']) # (電影名, 評價人數(shù)) info = [(m, int(n.split('人')[0])) for m, n in list(zip(name, ranting_num))] # 按評價人數(shù)排序 info.sort(key=lambda x: x[1]) # print(info) name = [x[0] for x in info[-10:]] ranting_num = [x[1] for x in info[-10:]] plt.figure(figsize=(12, 6), dpi=100) # 繪制橫著的條形圖 plt.barh(name, ranting_num, color='cyan', height=0.4) # 添加描述信息 plt.xlabel('評價人數(shù)') plt.title('豆瓣電影Top250-評價人數(shù)Top10') plt.savefig('test7.png') plt.show() '''豆瓣電影Top250評分-排名的散點分布''' # 豆瓣電影Top250 排名 評分 散點圖描述關(guān)系 rating = list(df["排名"]) rating_score = list(df["評分"]) plt.figure(figsize=(9, 6), dpi=100) # 繪制散點圖 設(shè)置點的顏色 plt.scatter(rating_score, rating, c='r') # 添加描述信息 設(shè)置字體大小 plt.xlabel("評分", fontsize=12) plt.ylabel("排名", fontsize=12) plt.title("豆瓣電影Top250評分-排名的散點分布", fontsize=15) # 添加網(wǎng)格 網(wǎng)格的透明度 線條樣式 plt.grid(alpha=0.5, linestyle=":") plt.savefig('test8.png') plt.show() '''豆瓣電影Top250詞云''' # 讀取數(shù)據(jù) with open('top250.txt', encoding='utf-8') as f: data = f.read() # 文本預(yù)處理 去除一些無用的字符只提取出中文出來 new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S) new_data = " ".join(new_data) # 文本分詞 seg_list_exact = jieba.cut(new_data, cut_all=False) result_list = [] with open('top250.txt', encoding='utf-8') as f: con = f.readlines() stop_words = set() for i in con: i = i.replace("\n", "")# 去掉讀取每一行數(shù)據(jù)的\n stop_words.add(i) for word in seg_list_exact: # 設(shè)置停用詞并去除單個詞 if word not in stop_words and len(word) > 1: result_list.append(word) print(result_list) gen_stylecloud( text=' '.join(result_list), size=500, collocations=False, font_path=r'C:\Windows\Fonts\msyh.ttc', output_name='test9.png', icon_name='fas fa-video', palette='colorbrewer.qualitative.Dark2_7' )
5 效果展示
5.1 網(wǎng)絡(luò)爬蟲
5.1.1 爬取近五年主要城市數(shù)據(jù)
5.1.2 爬取2019年各省GDP
Province GDP
北京市 35371.28
天津市 14104.28
河北省 35104.52
山西省 17026.68
內(nèi)蒙古自治區(qū) 17212.53
遼寧省 24909.45
吉林省 11726.82
黑龍江省 13612.68
上海市 38155.32
表 4 2019_Province_GDP.csv部分?jǐn)?shù)據(jù)
5.1.3 爬取豆瓣電影Top250
5.2 數(shù)據(jù)可視化
5.2.1條形圖
2019年各省GDP,這個條形圖效果不是很好,可以對數(shù)據(jù)處理一下,可以一個圖里面少點省份。
通過減少圖中數(shù)據(jù),下面這幾個條形圖效果較好。
5.2.2 散點圖
豆瓣電影Top250散點分別,可以更直觀的看到不同評分所處的排名。
5.2.3 餅圖
5.2.4 箱線圖
5.2.5 樹地圖
5.2.6 玫瑰圖
5.2.7 詞云
6 總結(jié)
通過對Python爬蟲以及數(shù)據(jù)可視化的學(xué)習(xí),在這過程中查閱了許多的資料。主要實現(xiàn)了爬取2019年各省數(shù)據(jù)和主要城市近五年,還有豆瓣電影top250,用圖表等可視化方式更直觀的看數(shù)據(jù)。對Python常用模塊和函數(shù)的使用方法有了進(jìn)一步的了解。
由于時間有限,項目還有許多不足,對于爬取的同一個網(wǎng)站不同頁面。爬取的代碼部分有重復(fù),代碼就有點長。代碼質(zhì)量不高。有的對數(shù)據(jù)沒有處理,直接拿過來用。第一個條形圖看起來效果很差,不能很好的展現(xiàn)數(shù)據(jù)信息。仍需繼續(xù)改進(jìn)。
7參考文獻(xiàn)
[1]楊露,葛文謙. 基于Python的制造業(yè)數(shù)據(jù)分析可視化平臺設(shè)計[J]. 《信息化研究》,2018年10月第44卷第5期.
[2]左薇,張熹,董紅娟. 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 《軟件導(dǎo)刊》,2020年2月第19卷第2期.
[3]孫遠(yuǎn)波,聞芷藝,徐瑞格. 新型冠狀病毒肺炎疫情數(shù)據(jù)可視化設(shè)計綜述 [J]. 《包裝工程》,2020年4月第41卷第8期.
[4]董付國,Python程序設(shè)計基礎(chǔ)(第2版).清華大學(xué)出版社,2018.
以上就是python教程網(wǎng)絡(luò)爬蟲及數(shù)據(jù)可視化原理解析的詳細(xì)內(nèi)容,更多關(guān)于python網(wǎng)絡(luò)爬蟲及數(shù)據(jù)可視化的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。