爬蟲入門教程⑩— 用漂亮的圖表展示爬取到的數(shù)據(jù)

經(jīng)過了前面的努力缓溅,我們成功獲取到了數(shù)據(jù),并且學(xué)會(huì)了保存缤苫,但是只是用網(wǎng)頁展示出來速兔,是不是有一些不夠美觀呢?

所以本節(jié)的內(nèi)容是:數(shù)據(jù)的可視化活玲。拿到了數(shù)據(jù)卻不能使其簡(jiǎn)單易懂并且足夠突出涣狗,那就是不是好的數(shù)據(jù)工程師。

效果圖:


部分效果圖
  • 本節(jié)需要做的準(zhǔn)備

安裝pyecharts這個(gè)Python的圖表庫:在之前我們安裝了requests舒憾、lxml镀钓、bs4。所以只需要再在cmd里面 pip3 install pyecharts==0.5.6 就OK啦镀迂,如果失敗丁溅,請(qǐng)仔細(xì)閱讀教程:爬蟲入門教程⑥—安裝爬蟲常用工具包.

??ps:由于pyecharts升級(jí)到1.x版本,發(fā)生了較大的變化探遵,所以本教程安裝時(shí)候指定了版本為0.5.6窟赏,否則代碼會(huì)報(bào)錯(cuò)妓柜。
如果報(bào)錯(cuò)ImportError: cannot import name 'Page' from 'pyecharts'那就是沒有加版本限制導(dǎo)致安裝了最新版的pyecharts,需要先執(zhí)行pip3 uninstall pyecharts涯穷,按y確認(rèn)之后棍掐,再次執(zhí)行 pip3 install pyecharts==0.5.6
后續(xù)會(huì)繼續(xù)更新教程的拷况。

?

  • pyecharts簡(jiǎn)介

這是百度echarts圖表庫塌衰,使用Python接口進(jìn)行生成圖表的一個(gè)庫,非常炫酷蝠嘉。在之前繪圖基本上是用的【Matplotlib】這個(gè)庫最疆,這個(gè)庫功能非常強(qiáng)大,但是缺點(diǎn)也比較明顯蚤告,api調(diào)用比較復(fù)雜努酸,新手上手很慢也很難。于是在去年杜恰,陳鍵冬大佬推出了一個(gè)簡(jiǎn)單易用的繪圖庫 pyecharts获诈。

我當(dāng)時(shí)懷著試一試的心情使用了一下,哇心褐,超好用的舔涎,對(duì)新手超友好的,代碼和圖都寫出來了逗爹,非常詳細(xì)亡嫌,同時(shí)配置項(xiàng)也非常清晰。一口氣畫5個(gè)圖都超快超簡(jiǎn)單的~掘而!

  • 確定可視化的目標(biāo)

這是很重要的一步挟冠,先確認(rèn)哪些數(shù)據(jù)值得拿來可視化,然后再去編寫代碼袍睡。一部電影的信息有:名字知染、上映日期、地區(qū)斑胜、類型控淡、關(guān)注者數(shù)量。最明顯的當(dāng)然是關(guān)注者數(shù)量排行榜(柱狀圖)止潘,除此之外我還想了幾個(gè):
上映電影類型占比(餅圖)
上映地區(qū)占比(餅圖)
上映日期柱狀圖

  • 采集所有電影信息

先上之前的代碼:

import requests
from bs4 import BeautifulSoup  # 從bs4引入BeautifulSoup

#請(qǐng)求網(wǎng)頁
# 舊版教程
# url = "https://movie.douban.com/cinema/later/chengdu/"
# response = requests.get(url)

# 2019-12-23更新掺炭,解決不能獲取到響應(yīng)的問題
url = "https://movie.douban.com/cinema/later/chengdu/"  # URL不變
# 新增偽裝成Chrome瀏覽器的header
fake_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
}
response = requests.get(url, headers=fake_headers)  # 請(qǐng)求參數(shù)里面把假的請(qǐng)求header加上

soup = BeautifulSoup(response.content.decode('utf-8'), 'lxml')

all_movies = soup.find('div', id="showing-soon")  # 先找到最大的div

for each_movie in all_movies.find_all('div', class_="item"):  # 從最大的div里面找到影片的div
    # print(each_movie)  # 輸出每個(gè)影片div的內(nèi)容
    all_a_tag = each_movie.find_all('a')
    all_li_tag = each_movie.find_all('li')
    movie_name = all_a_tag[1].text
    moive_href = all_a_tag[1]['href']
    movie_date = all_li_tag[0].text
    movie_type = all_li_tag[1].text
    movie_area = all_li_tag[2].text
    movie_lovers = all_li_tag[3].text
    print('名字:{},鏈接:{}覆山,日期:{}竹伸,類型:{},地區(qū):{}, 關(guān)注者:{}'.format(
        movie_name, moive_href, movie_date, movie_type, movie_area, movie_lovers))

這是數(shù)據(jù)的基礎(chǔ)信息勋篓,我們先全部拿到吧享,然后放進(jìn)一個(gè)list,方便后續(xù)的比較分析處理譬嚣。同時(shí)我們?cè)诖a頂部钢颂,從pyecharts引入Page(在一張圖顯示多個(gè)圖表)、Pie(餅圖)拜银、Bar(柱狀圖)殊鞭。

# 可視化爬取結(jié)果
import requests
from bs4 import BeautifulSoup  # 從bs4引入BeautifulSoup
from pyecharts import Page, Pie, Bar  # 引入繪圖需要的模塊

#請(qǐng)求網(wǎng)頁
# 舊版教程
# url = "https://movie.douban.com/cinema/later/chengdu/"
# response = requests.get(url)

# 2019-12-23更新,解決不能獲取到響應(yīng)的問題
url = "https://movie.douban.com/cinema/later/chengdu/"  # URL不變
# 新增偽裝成Chrome瀏覽器的header
fake_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
}
response = requests.get(url, headers=fake_headers)  # 請(qǐng)求參數(shù)里面把假的請(qǐng)求header加上

soup = BeautifulSoup(response.content.decode('utf-8'), 'lxml')

all_movies = soup.find('div', id="showing-soon")  # 先找到最大的div

# 先把所有的數(shù)據(jù)存到這個(gè)list里面
all_movies_info = []
for each_movie in all_movies.find_all('div', class_="item"):  # 從最大的div里面找到影片的div
    # print(each_movie)  # 輸出每個(gè)影片div的內(nèi)容
    all_a_tag = each_movie.find_all('a')
    all_li_tag = each_movie.find_all('li')
    movie_name = all_a_tag[1].text
    moive_href = all_a_tag[1]['href']
    movie_date = all_li_tag[0].text
    movie_type = all_li_tag[1].text
    movie_area = all_li_tag[2].text
    movie_lovers = all_li_tag[3].text.replace('人想看', '') #  去掉除了數(shù)字之外的字
    # 把電影數(shù)據(jù)添加到list
    all_movies_info.append({'name': movie_name, 'date': movie_date, 'type': movie_type, 
                            'area': movie_area, 'lovers': movie_lovers})
    # print('名字:{}尼桶,日期:{}操灿,類型:{},地區(qū):{}泵督, 關(guān)注者:{}'.format(
        # movie_name, movie_date, movie_type, movie_area, movie_lovers))
print(all_movies_info)  # 輸出一下檢查數(shù)據(jù)是否傳遞成功

?

  • 繪制關(guān)注者排行榜

處理邏輯:首先把所有的電影以關(guān)注者數(shù)量排個(gè)序趾盐,然后從所有電影里面以獲取到電影的名字和電影的關(guān)注者數(shù)量,最后添加到柱狀圖里小腊。
sorted函數(shù)救鲤,第一個(gè)參數(shù)接受一個(gè)可以遍歷的對(duì)象,key參數(shù)接受一個(gè)匿名函數(shù)秩冈,用以指定以遍歷對(duì)象內(nèi)的哪個(gè)元素作為排序的依據(jù)
以下代碼添加到上一個(gè)示例代碼后面即可本缠。

# 繪制關(guān)注者排行榜圖

# i['name'] for i in all_movies_info 這個(gè)是Python的快捷方式,
# 這一句的作用是從all_movies_info這個(gè)list里面依次取出每個(gè)元素入问,
# 并且取出這個(gè)元素的 name 屬性
sort_by_lovers = sorted(all_movies_info, key=lambda x: int(x['lovers']))
all_names = [i['name'] for i in sort_by_lovers]
all_lovers = [i['lovers'] for i in sort_by_lovers]

lovers_rank_bar = Bar('電影關(guān)注者排行榜')  # 初始化圖表丹锹,給個(gè)名字
# all_names是所有電影名,作為X軸, all_lovers是關(guān)注者的數(shù)量队他,作為Y軸卷仑。二者數(shù)據(jù)一一對(duì)應(yīng)。
# is_convert=True設(shè)置x麸折、y軸對(duì)調(diào),。is_label_show=True 顯示y軸值垢啼。 label_pos='right' Y軸值顯示在右邊
lovers_rank_bar.add('', all_names, all_lovers, is_convert=True, is_label_show=True, label_pos='right')
lovers_rank_bar  # jupyter下直接顯示圖表在輸出框內(nèi)
還有 61% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末张肾,一起剝皮案震驚了整個(gè)濱河市芭析,隨后出現(xiàn)的幾起案子吞瞪,更是在濱河造成了極大的恐慌馁启,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翠勉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)对碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿偎,“玉大人朽们,你說我怎么就攤上這事∷呶唬” “怎么了骑脱?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵苍糠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我椿息,道長(zhǎng),這世上最難降的妖魔是什么条舔? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任乏矾,我火速辦了婚禮孟抗,結(jié)果婚禮上钻心,老公的妹妹穿的比我還像新娘凄硼。我一直安慰自己捷沸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布痒给。 她就那樣靜靜地躺著,像睡著了一般苍柏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上试吁,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音烛恤,去河邊找鬼母怜。 笑死棒动,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的船惨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粱锐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疙挺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怜浅,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铐然,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恶座,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀暑,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跨琳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脉让。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术唬,死狀恐怖滚澜,靈堂內(nèi)的尸體忽然破棺而出粗仓,到底是詐尸還是另有隱情博秫,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布挡育,位于F島的核電站朴爬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逸爵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一凹嘲、第九天 我趴在偏房一處隱蔽的房頂上張望师倔。 院中可真熱鬧周蹭,春花似錦、人聲如沸凶朗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘸洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間反肋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工囚玫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留读规,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓束亏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碍遍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容