|
|
|
|
移动端

用Python来看3天破10亿的《我不是药神》到底神在哪?

《我不是药神》是由文牧野执导,徐峥、王传君、周一围、谭卓、章宇、杨新鸣等主演的喜剧电影,于 2018 年 7 月 6 日在中国上映。

作者:刘晓明来源:51CTO技术栈|2018-07-09 14:21

开发者盛宴来袭!7月28日51CTO首届开发者大赛决赛带来技术创新分享

【51CTO.com原创稿件】《我不是药神》是由文牧野执导,徐峥、王传君、周一围、谭卓、章宇、杨新鸣等主演的喜剧电影,于 2018 年 7 月 6 日在中国上映。

影片在未上映前,大规模的点映积攒了相当高的人气和口碑, 截止 7 月 9 日凌晨:豆瓣评分:9.0 分,猫眼:9.7 分,淘票票:9.5 分,时光网:8.8 分 。

为什么我说这三个网站呢,因为我们今天近 5000+ 条短评数据就来自于此,用专业的数据更有说服力。

综合几家的数据:五星推荐如此之高,生活环境是真实的,情绪是真实的,困境也是真实的,甚至女主角是一个真实的上了年纪的美女,有真实的皱纹!真实才能带来沉浸体验。表面说的是药,深层说的是命。

药能治病,命却不由自主,直面中国底层生命的苦难和尊严,也没有逃避对社会制度和商业法则的拷问,这是影片锲入中国现实的关键,也是引发大众共鸣的核心。

盛世危言,却让人能看到希望,这部影片极有可能成为 2018 年最具有爆炸性的话题。这也许就是未播先火,豆瓣 16 年后首部 9.0 高分电影的原因。

今天我们用 5000+ 条数据来分析一下,哪些地区,什么样的人,喜欢这部电影。

程勇只是个卖印度神油的小贩,日子过的还凑合。老爹血管瘤急着做手术,住院没钱,妻子要带儿子移民去国外发展,靠卖印度神油挣来的钱连水电费都交不起,处处都需要钱。

神秘男子吕受益找到程勇,让他从印度帮忙代购一款药物。吕受益患有血液癌症,需要长期服用抗癌药物进行治疗。

正版药「瑞士格列宁」非常昂贵,普通人家根本供应不起,但在印度有一款仿制药「印度格列宁」价格却只有 1/20,但在中国是属于禁药,走私被抓,是需要负法律责任的。

在巨大利益的驱使下,思慧,神父,黄毛先后出场,卖药五人组团建成功,他成为一名“药贩子”。

对于病友来说,他们拥有了活下去的机会,纷纷给程勇送锦旗,自此称其为“药神”。

代购的药出现问题,假药贩子张长林的出现威胁程勇,怕被抓,卖药组正式散伙。

程勇开了工厂,吕受益死,张长林跑路,让程勇完成第一次蜕变,许多病人无药可吃,程勇再次去印度并重新团建卖药。

警方严打假药贩子,张长林被抓。警方发现程勇窝点,黄毛为了掩护程勇而死,让他完成第二次蜕变。

以赔本价继续代购印度药,送儿子移民,晚上卖药被警察抓。三年后出狱,外面已是改天换地。

《我不是药神》的现实意义大于电影本身,许多人评论这部电影都有些扬眉吐气的感觉,大家都在做一个中国电影终于敢说真话的梦。

截止 7 月 9 日凌晨,累积票房超过 13 个亿,占当天票房近 84%。

是哪些地区贡献的票房更多一些,通过数据分析发现:

如这张图片动态展示的情况,你会发现贡献最多的还是:北京、上海、广州,二线城市同样成为票房的贡献者。

从画像来看,更趋于中年,油腻的中年,人人都怕老病死,人人都怕上下为难,人人都有为谋生计不得不做的事情,人人亦都向往真与善……是这些时刻集中起来让煽情的《药神》不那么脱离现实。

从数据上来看,好看,现实,好片,感人,泪点,作品很棒。

“领导,我求求你,别再查「假药」了行么。这药假不假,我们这些吃的人还不知道么?”

”我吃了三年正版药,房子吃没了,家也吃垮了。现在好不容易有了便宜药,可你们非说这是「假药」。不吃药,我们就只能等死。”

《我不是药神》戳中的是每个人的痛点,谁能保证这一辈子自己和家人不生病呢?

一旦遇上大病,动辄上万的高昂医药费让普通人家根本无力承担。一人生病,全家拖垮,真不是危言耸听。

下面我们回归技术,分享一下我们如何获取的数据:

首先是豆瓣,豆瓣自从去年 10 月份已经全面禁止爬取数据,仅仅放出 500 条数据,豆瓣封 IP,白天一分钟可以访问 40 次,晚上一分钟可以访问 60 次,超过限制次数就会封 IP。

  1. import urllib 
  2. import requests 
  3. from urllibimport request 
  4. import time 
  5. header = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:54.0) Gecko/20100101 Firefox/54.0'
  6. 'Connection''keep-alive'
  7. cookies = 'v=3; iuuid=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; webp=true; ci=1%2C%E5%8C%97%E4%BA%AC; __guid=26581345.3954606544145667000.1530879049181.8303; _lxsdk_cuid=1646f808301c8-0a4e19f5421593-5d4e211f-100200-1646f808302c8; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; monitor_count=1; _lxsdk_s=16472ee89ec-de2-f91-ed0%7C%7C5; __mta=189118996.1530879050545.1530936763555.1530937843742.18' 
  8. def html_prase(url): 
  9. r = requests.get(url).content 
  10. return r 
  11. cookie = {} 
  12. for line in cookies.split(';'): 
  13. name, value = cookies.strip().split('=', 1) 
  14.     cookie[name] = value 
  15. def html_prase(url): 
  16. r = requests.get(url).content 
  17. return r 
  18. for iin range(1, 100): 
  19. print('正在打印第%s页' % i) 
  20. try: 
  21. url= 'http://m.maoyan.com/mmdb/comments/movie/1200486.json?_v_=yes&offset=%s&' % ( 
  22. i* 15)  
  23. print(url) 
  24.         proxy = html_prase('http://172.17.0.29:5010/get/')..decode('utf-8')  # 代理是自建代理池,有需要使用代理的可以联系我,知乎ID:布道 
  25. html = requests.get(url=url, cookies=cookie, headers=header, 
  26. proxies={"http""http://{}".format(proxy)}).content 
  27.         data = json.loads(html.decode('utf-8'))['cmts'
  28. for item in data: 
  29. comment = item['content'
  30.             date = item['time'].split(' ')[0] 
  31.             rate = item['score'
  32.             city = item['cityName'
  33. img= item['avatarurl'
  34. print(date, rate, comment, city, ) 
  35. with open('maoyan_08.txt''a', encoding='utf-8'as f: 
  36. f.write(date + ',' + str(rate) + ',' + comment + ',' + comment + ',' + city + '\n'
  37. if img: 
  38. f = open('C:\\Users\My\Desktop\yaoshen\img\\' + img.split('/')[-1], 'wb') 
  39. f.write((urllib.request.urlopen(img)).read()) 
  40. except
  41. continue 
  42. time.sleep(5 + float(random.randint(1, 100)) / 20) 

另外一种方式:(Anyproxy+JS+Python+Monkeyrunner),可以爬取 Web 静态网站、App 应用、JS 渲染数据的动态网站的数据都可以进行爬取。

安装使用,请查阅官方 Github:https://github.com/alibaba/anyproxy

JS 代码:

  1. var logMap = {} 
  2. var fs = require('fs'); 
  3. var iconv = require('iconv-lite'); 
  4. var logger = fs.createWriteStream('./urlLog.log', { 
  5.     flags: 'a' // 'a' means appending (old data will be preserved) 
  6. }) 
  7. function logPageFile(url) { 
  8.     if (!logMap[url]) { 
  9.         logMap[url] = true
  10.         logger.write(url + '\r\n'); 
  11.     } 
  12. function postData(post_data, path, cb) { 
  13.     // // Build the post string from an object 
  14.     // var post_data = JSON.stringify({ 
  15.     //     'data': data 
  16.     // }); 
  17.  
  18.     // An object of options to indicate where to post to 
  19.     var post_options = { 
  20.         host: '127.0.0.1'
  21.         port: '9999'
  22.         path: '/' + path, 
  23.         method: 'POST'
  24.         headers: { 
  25.             'Content-Type''application/json'
  26.             'Content-Length': Buffer.byteLength(post_data) 
  27.         } 
  28.     }; 
  29.  
  30.     var http = require('http'); 
  31.     // Set up the request 
  32.     var post_req = http.request(post_options, function (res) { 
  33.         res.setEncoding('utf8'); 
  34.         res.on('data', cb); 
  35.     }); 
  36.  
  37.     logger.write('request post data 1\r\n'
  38.  
  39.     // post the data 
  40.     post_req.write(post_data); 
  41.  
  42.     logger.write('request post data 2\r\n'
  43.     post_req.end(); 
  44.  
  45. module.exports = { 
  46.     summary: 'a rule to modify response'
  47.     * beforeSendResponse(requestDetail, responseDetail) { 
  48.  
  49.       if (/movie\/1200486/i.test(requestDetail.url)) { 
  50.           logger.write('matched: ' + requestDetail.url + '\r\n'); 
  51.           if (responseDetail.response.toString() !== "") { 
  52.               logger.write(responseDetail.response.body.toString()); 
  53.               var post_data = JSON.stringify({ 
  54.                   'url': requestDetail.url, 
  55.                   'body': responseDetail.response.body.toString() 
  56.               }); 
  57.               logger.write("post comment to server -- ext"); 
  58.               postData(post_data, 'douban_comment'function (chunk) { 
  59.               }); 
  60.          } 
  61.       } 
  62.     }, 
  63. }; 

使用 AnyProxy 加载 JS 代码:anyproxy -i --rule wxrule.js

  1. #!/usr/bin/env python3 
  2.  
  3. import asyncio 
  4. import re 
  5. import textwrap 
  6. import threading 
  7. import time 
  8.  
  9. import os 
  10. import pymysql 
  11. from mysqlmgrimport MysqlMgr 
  12. from mongomgrimport MongoManager 
  13. from subprocess import call 
  14. import requests 
  15. from lxmlimport etree 
  16. from lxmlimport html 
  17. from aiohttp.webimport Application, Response, StreamResponse, run_app 
  18. import json 
  19. STATE_RUNNING = 1 
  20. STATE_IN_TRANSACTION = 2 
  21. running_state= 0 
  22. run_swipe= True 
  23. last_history_time= time.clock() 
  24. # A thread to save data to database in background 
  25. def insert_to_database(biz, msglist): 
  26. try: 
  27. for msg in msglist: 
  28. print(biz) 
  29. print(msg['comm_msg_info']['id']) 
  30. mongo_mgr.enqueue_data(msg['comm_msg_info']['id'], biz, msg ) 
  31. except Exception as e: 
  32. print(e) 
  33. def save_data(biz, msglist_str): 
  34. save_thread= threading.Thread(target=insert_to_database, args=(biz, msglist_str,)) 
  35. save_thread.setDaemon(True
  36. save_thread.start() 
  37.  
  38. def swipe_for_next_page(): 
  39. while run_swipe: 
  40. time.sleep(5) 
  41. if time.clock() - last_history_time>120: 
  42. if running_state== STATE_RUNNING: 
  43. reenter() 
  44. continue 
  45. call(["adb""shell""input""swipe""400""1000""400""200"]) 
  46. def reenter(): 
  47. global running_state 
  48. running_state= STATE_IN_TRANSACTION 
  49. # 模拟侧滑实现返回上一页 
  50. call(["adb""shell""input""swipe""0""400""400""400"]) 
  51. time.sleep(2) 
  52. # 点击"进入历史消息",每个手机的位置不一样,需要单独设置 X  和 Y 
  53. call(["adb""shell""input""tap""200""1200"]) 
  54. time.sleep(2) 
  55. header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0','Connection':'keep-alive'
  56. def html_prase(url): 
  57. r = requests.get(url,header).content 
  58. return html.fromstring(r) 
  59.  
  60. async def report_url(request): 
  61. resp = StreamResponse() 
  62.     data = await request.json() 
  63. url= data['url'
  64. # print("url reported: " + url) 
  65. biz = re.findall('__biz=(.*?)\&', url) 
  66. if len(biz) == 0: 
  67. await resp.prepare(request) 
  68. return resp 
  69.     biz = biz[0] 
  70. print('----------------\r\n'+ biz + '\r\n----------------\r\n'
  71. mysql_mgr.enqueue_biz(biz, ''
  72. bizs.add(biz) 
  73.     biz = biz.encode('utf8'
  74. resp.content_type= 'text/plain' 
  75. await resp.prepare(request) 
  76. resp.write(biz) 
  77. await resp.write_eof() 
  78. return resp 
  79. async def intro(request): 
  80. txt = textwrap.dedent("""\ 
  81.         Type {url}/hello/John  {url}/simple or {url}/change_body 
  82.         in browser url bar 
  83.     """).format(url='127.0.0.1:8080'
  84.     binary = txt.encode('utf8'
  85.     resp = StreamResponse() 
  86. resp.content_length= len(binary
  87. resp.content_type= 'text/plain' 
  88. await resp.prepare(request) 
  89. resp.write(binary
  90. return resp 
  91. async def simple(request): 
  92. return Response(text="Simple answer"
  93. async def change_body(request): 
  94. resp = Response() 
  95. resp.body= b"Body changed" 
  96. resp.content_type= 'text/plain' 
  97. return resp 
  98. # coding=utf-8 
  99. async def app_douban_comment(request): 
  100. resp = StreamResponse() 
  101.     data = await request.json() 
  102. global running_state 
  103. global last_history_time 
  104. msg_data= json.loads(data['body'])['data']['cts'
  105. for item in msg_data: 
  106. comment = item['ce'].strip().replace('\n',''
  107.         rate = item['cr'
  108. print(comment, rate) 
  109. with open('date_rate_comment_sg.txt''a', encoding='utf-8'as f: 
  110. f.write('2018-07-06' + ',' + str(rate) + ',' + comment + '\n'
  111. last_history_time= time.clock() 
  112. resp.content_type= 'text/plain' 
  113. await resp.prepare(request) 
  114. await resp.write_eof() 
  115. return resp 
  116. last_history_time= time.clock() 
  117. resp.content_type= 'text/plain' 
  118. await resp.prepare(request) 
  119. await resp.write_eof() 
  120. return resp 
  121. async def init(loop): 
  122. app = Application() 
  123. app.router.add_get('/', intro) 
  124. app.router.add_post('/url', report_url) 
  125. app.router.add_post('/douban_comment', app_douban_comment) 
  126. return app 
  127. def start_swipe_thread(): 
  128. try: 
  129. t = threading.Thread( 
  130. target=swipe_for_next_page, name='swipe'
  131. set daemon so main thread can exit when receives ctrl-c 
  132. t.setDaemon(True
  133. t.start() 
  134. except Exception: 
  135. print("Error: unable to start thread"
  136. loop = asyncio.get_event_loop() 
  137. app = loop.run_until_complete(init(loop)) 
  138. run_app(app, host='127.0.0.1', port=9999) 

这是示例代码,实际使用过程,需要进行微调。获取猫眼数据,最难是难在找猫眼 App 的数据接口。

我费了很大力气才找到:http://m.maoyan.com/mmdb/comments/movie/1200486.json?_v_=yes&offset=15'

接口怎么使用,直接看代码,获取淘票票的数据需要你自己去尝试找一下。

  1. import json 
  2. import random 
  3. import urllib 
  4. import requests 
  5. from urllibimport request 
  6. import time 
  7. header = {'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:54.0) Gecko/20100101 Firefox/54.0'
  8. 'Connection''keep-alive'
  9. cookies ='v=3; iuuid=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; webp=true; ci=1%2C%E5%8C%97%E4%BA%AC; __guid=26581345.3954606544145667000.1530879049181.8303; _lxsdk_cuid=1646f808301c8-0a4e19f5421593-5d4e211f-100200-1646f808302c8; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; monitor_count=1; _lxsdk_s=16472ee89ec-de2-f91-ed0%7C%7C5; __mta=189118996.1530879050545.1530936763555.1530937843742.18' 
  10. cookie = {} 
  11. for line in cookies.split(';'): 
  12. name, value = cookies.strip().split('=', 1) 
  13.     cookie[name] = value 
  14. def html_prase(url): 
  15. r = requests.get(url).content 
  16. return r 
  17. for iin range(1, 100): 
  18. print('正在打印第%s页' % i) 
  19. try: 
  20. url= 'http://m.maoyan.com/mmdb/comments/movie/1200486.json?_v_=yes&offset=%s&' %(i*15) +'startTime=2018-07-01%2012%3A30%3A42' 
  21. print(url) 
  22.         html = requests.get(url=url, cookies=cookie, headers=header).content 
  23.         data = json.loads(html.decode('utf-8'))['cmts'
  24. for item in data: 
  25. comment = item['content'
  26.             date = item['time'].split(' ')[0] 
  27.             rate = item['score'
  28.             city = item['cityName'
  29. img= item['avatarurl'
  30. print(date, rate, comment, city, ) 
  31. with open('maoyan_08.txt''a', encoding='utf-8'as f: 
  32. f.write(date + ',' + str(rate) + ',' + comment +',' + comment + ','+ city +'\n'
  33. if img: 
  34. f = open('C:\\Users\My\Desktop\yaoshen\img\\' + img.split('/')[-1], 'wb') 
  35. f.write((urllib.request.urlopen(img)).read()) 
  36. except
  37. break 
  38. time.sleep(5 + float(random.randint(1, 100)) / 20) 

动态地图展示代码:

  1. from pyechartsimport Style 
  2. from pyechartsimport Geo 
  3. city =[] 
  4. with open('maoyan.txt', mode='r', encoding='utf-8'as f: 
  5. rows = f.readlines() 
  6. for row in rows
  7. if len(row.split(',')) == 5: 
  8. city.append(row.split(',')[4].replace('\n','')) 
  9. def all_list(arr): 
  10. result = {} 
  11. for iin set(arr): 
  12. result[i] = arr.count(i) 
  13. return result 
  14. data = [] 
  15. for item in all_list(city): 
  16. data.append((item,all_list(city)[item])) 
  17. style = Style( 
  18. title_color="#fff"
  19. title_pos="center"
  20. width=1200, 
  21. height=600, 
  22. background_color='#404a59' 
  23. geo = Geo( "《我不是药神》评论人群地理位置","数据来源:知乎ID:布道", **style.init_style) 
  24. attr, value = geo.cast(data) 
  25. geo.add("", attr, value, visual_range=[0, 100], 
  26. visual_text_color="#fff", is_legend_show=False
  27. symbol_size=20, is_visualmap=True
  28. tooltip_formatter='{b}'
  29. label_emphasis_textsize=15, 
  30. label_emphasis_pos='right'
  31. geo.render() 

每天爬取数据量代码:

  1. from pyechartsimport EffectScatter 
  2. from pyechartsimport Style 
  3.  
  4. style= Style( 
  5. title_color="#191970"
  6. title_pos="left"
  7. width=900, 
  8. height=450, 
  9. background_color='#F8F8FF' 
  10. es = EffectScatter("《我不是药神》短评数据情况","数据来源:知乎ID:布道", **style.init_style) 
  11. es.add("", [1], [270], symbol_size=20, effect_scale=4, 
  12. effect_period=5, symbol="pin"
  13. es.add("", [2], [606], symbol_size=20, effect_scale=4, 
  14. effect_period=5, symbol="pin"
  15. es.add("", [3], [542], symbol_size=20, effect_scale=4, 
  16. effect_period=5, symbol="pin"
  17. es.add("", [4], [550], symbol_size=20, effect_scale=4, 
  18. effect_period=5, symbol="pin"
  19. es.add("", [5], [656], ssymbol_size=20, effect_scale=4, 
  20. effect_period=5, symbol="pin"
  21. es.add("", [6], [850], ssymbol_size=20, effect_scale=4, 
  22. effect_period=5, symbol="pin"
  23. es.add("", [7], [993], symbol_size=20, effect_scale=4, 
  24. effect_period=5, symbol="pin"
  25. es.add("", [8], [903], symbol_size=20, effect_scale=4, 
  26. effect_period=5, symbol="pin"
  27.  
  28.  
  29. es.render() 

五星推荐河流图代码:

  1. from pyechartsimport Style 
  2. from pyechartsimport ThemeRiver 
  3.  
  4. data = [ 
  5.     ['2018/07/08', 802, '五星'], ['2018/07/08', 28, '四星'], ['2018/07/08', 9, '三星'], ['2018/07/08',8, '二星'], 
  6.     ['2018/07/08', 4, '一星'], 
  7.  
  8.     ['2018/07/07',802, '五星'], ['2018/07/07',166, '四星'], ['2018/07/07',17, '三星'],['2018/07/07',0, '二星'],['2018/07/07',8, '一星'], 
  9.     ['2018/07/06', 667, '五星'], ['2018/07/06', 156, '四星'], ['2018/07/06', 13, '三星'], ['2018/07/06', 10, '二星'],['2018/07/06', 4, '一星'], 
  10.     ['2018/07/05', 567, '五星'], ['2018/07/05', 76, '四星'], ['2018/07/05', 13, '三星'], ['2018/07/05', 0, '二星'],['2018/07/05', 0, '一星'], 
  11.     ['2018/07/04', 467, '五星'], ['2018/07/04', 67, '四星'], ['2018/07/04', 16, '三星'], ['2018/07/04', 0, '二星'],['2018/07/04', 0, '一星'], 
  12.     ['2018/07/03', 478, '五星'], ['2018/07/03', 56, '四星'], ['2018/07/03', 8, '三星'], ['2018/07/03', 0, '二星'],['2018/07/03', 0, '一星'], 
  13.     ['2018/07/02', 531, '五星'], ['2018/07/02', 67, '四星'], ['2018/07/02', 8, '三星'], ['2018/07/02', 0, '二星'],['2018/07/02', 0, '一星'], 
  14.     ['2018/07/01', 213, '五星'], ['2018/07/01', 45, '四星'], ['2018/07/01', 5, '三星'], ['2018/07/01', 1, '二星'], 
  15.     ['2018/07/01', 1, '一星'], 
  16.  
  17. style = Style( 
  18. title_color="#191970"
  19. title_pos="left"
  20. width=1200, 
  21. height=600, 
  22. background_color='#F8F8FF' 
  23. tr = ThemeRiver("《我不是药神》星级推荐","数据来源:知乎ID:布道", **style.init_style) 
  24. tr.add(['五星''四星''三星''二星''一星',], data, is_label_show=True
  25. tr.render() 

词云图:

  1. import pickle 
  2. from osimport path 
  3. import jieba 
  4. import matplotlib.pyplotas plt 
  5. from wordcloudimport WordCloud, STOPWORDS, ImageColorGenerator 
  6. def make_worldcloud(file_path): 
  7. text_from_file_with_apath= open(file_path,'r',encoding='UTF-8').read() 
  8. wordlist_after_jieba= jieba.cut(text_from_file_with_apath, cut_all=False
  9. wl_space_split= " ".join(wordlist_after_jieba) 
  10. print(wl_space_split) 
  11. backgroud_Image= plt.imread('./1.jpg'
  12. print('加载图片成功!'
  13. '''设置词云样式''' 
  14. stopwords= STOPWORDS.copy() 
  15. stopwords.add("哈哈"
  16. stopwords.add("电影"
  17. stopwords.add("真的"
  18. stopwords.add("就是"
  19. stopwords.add("真是"
  20. stopwords.add("中国"
  21. stopwords.add("没有"
  22. stopwords.add("可以"
  23. stopwords.add("一部"
  24. stopwords.add("还是"
  25. stopwords.add("最后"
  26. stopwords.add("一个")  #可以加多个屏蔽词#可以加多个屏蔽词 
  27. wc= WordCloud( 
  28. width=1024, 
  29. height=768, 
  30. background_color='white',# 设置背景颜色 
  31. mask=backgroud_Image,# 设置背景图片 
  32. font_path='E:\simsun.ttf',  # 设置中文字体,若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字 
  33. max_words=600, # 设置最大现实的字数 
  34. stopwords=stopwords,# 设置停用词 
  35. max_font_size=400,# 设置字体最大值 
  36. random_state=50,# 设置有多少种随机生成状态,即有多少种配色方案 
  37. wc.generate_from_text(wl_space_split)#开始加载文本 
  38. img_colors= ImageColorGenerator(backgroud_Image) 
  39. wc.recolor(color_func=img_colors)#字体颜色为背景图片的颜色 
  40. plt.imshow(wc)# 显示词云图 
  41. plt.axis('off')# 是否显示x轴、y轴下标 
  42. plt.show()#显示 
  43.     # 获得模块所在的路径的 
  44. d = path.dirname(__file__) 
  45. # os.path.join():  将多个路径组合后返回 
  46. wc.to_file(path.join(d, "h11.jpg")) 
  47. print('生成词云成功!'
  48.  
  49. make_worldcloud('cloud.txt'

图像画像代码:

  1. import os 
  2. from math import sqrt 
  3. from PIL import Image 
  4. #path是存放好友头像图的文件夹的路径 
  5. path = 'C:\\Users\My\Desktop\yaoshen\img\\' 
  6. pathList= [] 
  7. for item in os.listdir(path): 
  8. imgPath= os.path.join(path,item) 
  9. pathList.append(imgPath) 
  10. total = len(pathList)#total是好友头像图片总数 
  11. line = int(sqrt(total))#line是拼接图片的行数(即每一行包含的图片数量) 
  12. NewImage= Image.new('RGB', (128*line,128*line)) 
  13. x = y = 0 
  14. for item in pathList: 
  15. try: 
  16. img= Image.open(item) 
  17. img= img.resize((128,128),Image.ANTIALIAS) 
  18. NewImage.paste(img, (x * 128 , y * 128)) 
  19.         x += 1 
  20. except IOError: 
  21. print("第%d行,%d列文件读取失败!IOError:%s" % (y,x,item)) 
  22.         x -= 1 
  23. if x == line: 
  24. x = 0 
  25. y += 1 
  26. if (x+line*y) == line*line: 
  27. break 
  28. NewImage.save(path+"final.jpg"

作者:刘晓明

简介:互联网公司运维技术负责人,拥有 10 年的互联网开发和运维经验。一直致力于运维工具的开发和运维专家服务的推进,赋能开发,提高效能。最后给自己代个盐,欢迎大家有空时翻下我牌子(知乎号:布道,微信:AiDevOps),看看“开发运维”专栏的文章和公众号的文章,希望多些关注和点赞是给作者最好的鼓励 !

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

【编辑推荐】

  1. 7个提升Python程序性能的好习惯
  2. 数据库主从不一致,怎么解?
  3. 自从会了Python之后,我就没用过PS了!带你将照片变成卡通图片!
  4. 学习PHP好,还是Python好呢?
  5. 为什么Python开发人员应该使用Pipenv
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

视频课程+更多

标杆徐2018最新Linux自动化运维系列③: MySQL运维入门实战视频课程

标杆徐2018最新Linux自动化运维系列③: MySQL

讲师:徐亮伟1789人学习过

VMware vSAN 6.6视频课程

VMware vSAN 6.6视频课程

讲师:郝旺14642人学习过

VMware vSphere  VCP 6.5 | 6.7 视频

VMware vSphere VCP 6.5 | 6.7 视频

讲师:郝旺40046人学习过

读 书 +更多

Solaris 内核结构(第2版)

本书描述了Solaris 10和OpenSolaris内核中所有主要子系统的算法和数据结构,对第1版进行了大幅修订,加入了很多新的内容。全书从头到尾都采...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊