成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python數據可視化:2018年電影分析

大數據 數據可視化 數據分析
雙11已經過去,雙12即將來臨,離2018年的結束也就2個月不到,還記得年初立下的flag嗎?完成了多少?相信很多人和我一樣,抱頭痛哭...本次利用貓眼電影,實現對2018年的電影大數據進行分析。

雙11已經過去,雙12即將來臨,離2018年的結束也就2個月不到,還記得年初立下的flag嗎?

完成了多少?相信很多人和我一樣,抱頭痛哭...

本次利用貓眼電影,實現對2018年的電影大數據進行分析。

Python數據可視化:2018年電影分析

1 網頁分析

01 標簽

Python數據可視化:2018年電影分析

通過點擊貓眼電影已經歸類好的標簽,得到網址信息。

02 索引頁

Python數據可視化:2018年電影分析

打開開發(fā)人員工具,獲取索引頁里電影的鏈接以及評分信息。

索引頁一共有30多頁,但是有電影評分的只有10頁。

本次只對有電影評分的數據進行獲取。

03 詳情頁

Python數據可視化:2018年電影分析

對詳情頁的信息進行獲取。

主要是名稱,類型,國家,時長,上映時間,評分,評分人數,累計票房。

2 反爬破解

Python數據可視化:2018年電影分析

通過開發(fā)人員工具發(fā)現,貓眼針對評分,評分人數,累計票房的數據,施加了文字反爬。

Python數據可視化:2018年電影分析

通過查看網頁源碼,發(fā)現只要刷新頁面,三處文字編碼就會改變,無法直接匹配信息。

所以需要下載文字文件,對其進行雙匹配。

  1. from fontTools.ttLib import TTFont 
  2.  
  3. #font = TTFont('base.woff'
  4. #font.saveXML('base.xml'
  5. font = TTFont('maoyan.woff'
  6. font.saveXML('maoyan.xml'

將woff格式轉換為xml格式,以便在Pycharm中查看詳細信息。

利用下面這個網站,打開woff文件。

  • url: http://fontstore.baidu.com/static/editor/index.html

可以得到下面數字部分信息(上下兩塊)。

在Pycharm中查看xml格式文件(左右兩塊),你就會發(fā)現有對應信息。

Python數據可視化:2018年電影分析

通過上圖你就可以將數字6對上號了,其他數字一樣的。

  1. def get_numbers(u): 
  2.     ""
  3.     對貓眼的文字反爬進行破解 
  4.     ""
  5.     cmp = re.compile(",\n           url\('(//.*.woff)'\) format\('woff'\)"
  6.     rst = cmp.findall(u) 
  7.     ttf = requests.get("http:" + rst[0], stream=True
  8.     with open("maoyan.woff""wb"as pdf: 
  9.         for chunk in ttf.iter_content(chunk_size=1024): 
  10.             if chunk: 
  11.                 pdf.write(chunk) 
  12.     base_font = TTFont('base.woff'
  13.     maoyanFont = TTFont('maoyan.woff'
  14.     maoyan_unicode_list = maoyanFont['cmap'].tables[0].ttFont.getGlyphOrder() 
  15.     maoyan_num_list = [] 
  16.     base_num_list = ['.''3''0''8''9''4''1''5''2''7''6'
  17.     base_unicode_list = ['x''uniF561''uniE6E1''uniF125''uniF83F''uniE9E2''uniEEA6''uniEEC2''uniED38''uniE538''uniF8E7'
  18.     for i in range(1, 12): 
  19.         maoyan_glyph = maoyanFont['glyf'][maoyan_unicode_list[i]] 
  20.         for j in range(11): 
  21.             base_glyph = base_font['glyf'][base_unicode_list[j]] 
  22.             if maoyan_glyph == base_glyph: 
  23.                 maoyan_num_list.append(base_num_list[j]) 
  24.                 break 
  25.     maoyan_unicode_list[1] = 'uni0078' 
  26.     utf8List = [eval(r"'\u" + uni[3:] + "'").encode("utf-8"for uni in maoyan_unicode_list[1:]] 
  27.     utf8last = [] 
  28.     for i in range(len(utf8List)): 
  29.         utf8List[i] = str(utf8List[i], encoding='utf-8'
  30.         utf8last.append(utf8List[i]) 
  31.     return (maoyan_num_list ,utf8last) 

3 數據獲取

01 構造請求頭

  1. head = ""
  2. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
  3. Accept-Encoding:gzip, deflate, br 
  4. Accept-Language:zh-CN,zh;q=0.8 
  5. Cache-Control:max-age=0 
  6. Connection:keep-alive 
  7. Host:maoyan.com 
  8. Upgrade-Insecure-Requests:1 
  9. Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
  10. User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36 
  11. ""
  12.  
  13. def str_to_dict(header): 
  14.     ""
  15.     構造請求頭,可以在不同函數里構造不同的請求頭 
  16.     ""
  17.     header_dict = {} 
  18.     header = header.split('\n'
  19.     for h in header: 
  20.         h = h.strip() 
  21.         if h: 
  22.             k, v = h.split(':', 1) 
  23.             header_dict[k] = v.strip() 
  24.     return header_dict 

因為索引頁和詳情頁請求頭不一樣,這里為了簡便,構造了一個函數。

02 獲取電影詳情頁鏈接

  1. def get_url(): 
  2.     ""
  3.     獲取電影詳情頁鏈接 
  4.     ""
  5.     for i in range(0, 300, 30): 
  6.         time.sleep(10) 
  7.         url = 'http://maoyan.com/films?showType=3&yearId=13&sortId=3&offset=' + str(i) 
  8.         host = """Referer:http://maoyan.com/films?showType=3&yearId=13&sortId=3&offset=0 
  9.         ""
  10.         header = head + host 
  11.         headers = str_to_dict(header) 
  12.         response = requests.get(url=url, headers=headers) 
  13.         html = response.text 
  14.         soup = BeautifulSoup(html, 'html.parser'
  15.         data_1 = soup.find_all('div', {'class''channel-detail movie-item-title'}) 
  16.         data_2 = soup.find_all('div', {'class''channel-detail channel-detail-orange'}) 
  17.         num = 0 
  18.         for item in data_1: 
  19.             num += 1 
  20.             time.sleep(10) 
  21.             url_1 = item.select('a')[0]['href'
  22.             if data_2[num-1].get_text() != '暫無評分'
  23.                 url = 'http://maoyan.com' + url_1 
  24.                 for message in get_message(url): 
  25.                     print(message) 
  26.                     to_mysql(message) 
  27.                 print(url) 
  28.                 print('---------------^^^Film_Message^^^-----------------'
  29.             else
  30.                 print('The Work Is Done'
  31.                 break 

03 獲取電影詳情頁信息

  1. def get_message(url): 
  2.     ""
  3.     獲取電影詳情頁里的信息 
  4.     ""
  5.     time.sleep(10) 
  6.     data = {} 
  7.     host = """refer: http://maoyan.com/news 
  8.     ""
  9.     header = head + host 
  10.     headers = str_to_dict(header) 
  11.     response = requests.get(url=url, headers=headers) 
  12.     u = response.text 
  13.     # 破解貓眼文字反爬 
  14.     (mao_num_list, utf8last) = get_numbers(u) 
  15.     # 獲取電影信息 
  16.     soup = BeautifulSoup(u, "html.parser"
  17.     mw = soup.find_all('span', {'class''stonefont'}) 
  18.     score = soup.find_all('span', {'class''score-num'}) 
  19.     unit = soup.find_all('span', {'class''unit'}) 
  20.     ell = soup.find_all('li', {'class''ellipsis'}) 
  21.     name = soup.find_all('h3', {'class''name'}) 
  22.     # 返回電影信息 
  23.     data["name"] = name[0].get_text() 
  24.     data["type"] = ell[0].get_text() 
  25.     data["country"] = ell[1].get_text().split('/')[0].strip().replace('\n'''
  26.     data["length"] = ell[1].get_text().split('/')[1].strip().replace('\n'''
  27.     data["released"] = ell[2].get_text()[:10] 
  28.     # 因為會出現沒有票房的電影,所以這里需要判斷 
  29.     if unit: 
  30.         bom = ['分', score[0].get_text().replace('.''').replace('萬'''), unit[0].get_text()] 
  31.         for i in range(len(mw)): 
  32.             moviewish = mw[i].get_text().encode('utf-8'
  33.             moviewish = str(moviewish, encoding='utf-8'
  34.             # 通過比對獲取反爬文字信息 
  35.             for j in range(len(utf8last)): 
  36.                 moviewish = moviewish.replace(utf8last[j], maoyan_num_list[j]) 
  37.             if i == 0: 
  38.                 data["score"] = moviewish + bom[i] 
  39.             elif i == 1: 
  40.                 if '萬' in moviewish: 
  41.                     data["people"] = int(float(moviewish.replace('萬''')) * 10000) 
  42.                 else
  43.                     data["people"] = int(float(moviewish)) 
  44.             else
  45.                 if '萬' == bom[i]: 
  46.                     data["box_office"] = int(float(moviewish) * 10000) 
  47.                 else
  48.                     data["box_office"] = int(float(moviewish) * 100000000) 
  49.     else
  50.         bom = ['分', score[0].get_text().replace('.''').replace('萬'''), 0] 
  51.         for i in range(len(mw)): 
  52.             moviewish = mw[i].get_text().encode('utf-8'
  53.             moviewish = str(moviewish, encoding='utf-8'
  54.             for j in range(len(utf8last)): 
  55.                 moviewish = moviewish.replace(utf8last[j], maoyan_num_list[j]) 
  56.             if i == 0: 
  57.                 data["score"] = moviewish + bom[i] 
  58.             else
  59.                 if '萬' in moviewish: 
  60.                     data["people"] = int(float(moviewish.replace('萬''')) * 10000) 
  61.                 else
  62.                     data["people"] = int(float(moviewish)) 
  63.         data["box_office"] = bom[2] 
  64.     yield data 

4 數據存儲

01 創(chuàng)建數據庫及表格

 

  1. db = pymysql.connect(host='127.0.0.1'user='root'password='774110919', port=3306) 
  2. cursor = db.cursor() 
  3. cursor.execute("CREATE DATABASE maoyan DEFAULT CHARACTER SET utf8mb4"
  4. db.close() 
  5.  
  6. db = pymysql.connect(host='127.0.0.1'user='root'password='774110919', port=3306, db='maoyan'
  7. cursor = db.cursor() 
  8. sql = 'CREATE TABLE IF NOT EXISTS films (name VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL, country VARCHAR(255) NOT NULL, length VARCHAR(255) NOT NULL, released VARCHAR(255) NOT NULL, score VARCHAR(255) NOT NULL, people INT NOT NULL, box_office BIGINT NOT NULL, PRIMARY KEY (name))' 
  9. cursor.execute(sql) 
  10. db.close() 

其中票房收入數據類型為BIGINT(19位數),***為18446744073709551615。

INT(10位數),***為2147483647,達不到36億(3600000000)。

02 數據存儲

  1. def to_mysql(data): 
  2.     ""
  3.     信息寫入mysql 
  4.     ""
  5.     table = 'films' 
  6.     keys = ', '.join(data.keys()) 
  7.     values = ', '.join(['%s'] * len(data)) 
  8.     db = pymysql.connect(host='localhost'user='root'password='774110919', port=3306, db='maoyan'
  9.     cursor = db.cursor() 
  10.     sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values
  11.     try: 
  12.         if cursor.execute(sql, tuple(data.values())): 
  13.             print("Successful"
  14.             db.commit() 
  15.     except
  16.         print('Failed'
  17.         db.rollback() 
  18.     db.close() 

***成功存儲數據

Python數據可視化:2018年電影分析

5 數據可視化

可視化源碼就不放了,公眾號回復電影即可獲得。

01 電影票房***0

Python數據可視化:2018年電影分析

還剩一個多月,不知道榜單上會不會有新成員。最近「毒液」很火,蠻有希望。

02 電影評分***0

Python數據可視化:2018年電影分析

這里就得吐槽一下pyecharts,坐標轉換后,坐標值名稱太長就會被遮擋,還需改進呢~

03 電影人氣***0

Python數據可視化:2018年電影分析

茫茫人海之中,相信一定也有大家的身影,我也是其中的一員!!!

04 每月電影上映數量

Python數據可視化:2018年電影分析

每月上映數好像沒什么大差距,7月最少,難道是因為天氣熱?

05 每月電影票房

Python數據可視化:2018年電影分析

這里就看出春節(jié)檔電影的威力了,金三銀四、金九銀十,各行各業(yè)的規(guī)律,電影行業(yè)也不例外。

上一張圖我們知道7月份電影上新最少,票房反而是第二。

這里看了下數據,發(fā)現有「我不是藥神」「西虹市首富」「邪不壓正」「摩天營救」「狄仁杰之四大天王」幾部大劇撐著。

06 各國家電影數量***0

Python數據可視化:2018年電影分析

原來中國電影這么高產的,可是豆瓣TOP250里又有多少中國電影呢?深思!!!

07 中外票房對比

Python數據可視化:2018年電影分析

2017年的年度票房是560億,估計今年快要突破了。據說今年全年票房有望突破600億。

08 電影名利雙收***0

Python數據可視化:2018年電影分析

計算公式是,把某部電影的評分在所有電影評分中的排名與這部電影的票房在所有票房中的排名加起來,再除以電影總數。

除了「侏羅紀世界2」「***」「捉妖記2」,我都看過啦!

09 電影叫座不叫好***0

Python數據可視化:2018年電影分析

計算公式是,把某部電影的票房排名減去某部電影的評分排名加起來,再除以電影總數。

可能是貓眼的用戶比較仁慈吧,與豆瓣相比,普遍評分都比較高。我個人都不太敢相信這個結果。

不過有一個還是挺準的,「愛情公寓」。

10 電影類型分布

Python數據可視化:2018年電影分析

劇情電影永遠引人深思。感覺今年的電影好多跟錢有關,比如「我不是藥神」「西虹市首富」「一出好戲」「頭號玩家」,貧窮限制了大家伙們。

責任編輯:未麗燕 來源: 法納斯得
相關推薦

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2021-10-11 08:04:22

Python數據行程

2018-12-05 13:59:45

電影分析爬蟲

2018-11-21 14:09:31

可視化天氣霧霾

2018-12-03 16:50:23

數據可視化數據分析薪水

2019-01-02 11:59:26

Python數據可視化GDP

2017-12-21 11:08:18

2020-05-14 10:19:23

Python可視化分析

2017-10-14 13:54:26

數據可視化數據信息可視化

2018-03-16 14:53:53

BI數據可視化工具

2016-12-29 20:05:56

數據可視化大數據產品分析

2017-01-12 17:28:59

數據分析數據可視化可視化

2022-08-26 09:15:58

Python可視化plotly

2017-02-07 15:54:14

數據可視化數據分析

2020-05-26 11:34:46

可視化WordCloud

2022-02-23 09:50:52

PythonEchartspyecharts

2017-03-09 09:54:13

分析數據可視化

2016-11-25 11:16:22

阿里支付寶數據分析

2017-10-31 09:38:53

大數據數據可視化Python

2018-11-30 10:28:44

Python反爬網頁
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操电影 | 国产成人在线播放 | 伊人精品国产 | 国产精久久久久久 | 久久69精品久久久久久久电影好 | 欧美激情视频网站 | 99福利| 在线一级片 | 天天综合成人网 | 99精品国产一区二区三区 | 麻豆精品国产免费 | 一区二区三区国产 | 久久综合狠狠综合久久综合88 | 成人在线视频免费播放 | www.天堂av.com| av手机在线 | 精品一区二区三区入口 | 久草成人 | 久久福利电影 | 日本在线视频不卡 | 久草精品视频 | 亚洲 91| www.99热这里只有精品 | 国产欧美一区二区三区在线看蜜臀 | 999久久久免费精品国产 | 精品视频一区二区三区四区 | 亚洲国产成人精品女人久久久 | 中文字幕 在线观看 | 国产91久久久久 | 亚洲综合一区二区三区 | 欧美一级二级三级 | 亚洲一区 中文字幕 | 国产乱码精品一区二区三区中文 | 91天堂网 | 一级黄色生活视频 | 99免费在线观看 | 中文字幕91av| 伊人一区 | 国产麻豆乱码精品一区二区三区 | 中文字幕在线观 | 精品久久久久久久久久久久久久 |