热点
数据洪流实时掘金:分布式事务智能处理引领行业革新,reasoning_content:我们要求以分布式事务专家的口吻,写一个与“技术、科技”相关,关于[数据洪流实时掘金:智能处理引领行业革新]的标题直接输出一个标题,不要加说明字数30字以内需要简短精炼,体现分布式事务专家的口吻,同时紧扣数据洪流、实时掘金、智能处理、行业革新nn可能的数据洪流实时掘金:分布式事务智能处理引领革新但字数可能略多或者:实时掘金数据洪流:分布式事务智能革新或者更专家口吻:分布式事务专家:实时数据洪流智能掘金但要求直接输出标题,不需要署名nn简洁版:数据洪流实时掘金:智能处理引领行业革新正好11个字?不对,标题原样是数据洪流实时掘金:智能处理引领行业革新,字数14个字?数一下:数据洪流实时掘金(6)+冒号+智能处理引领行业革新(8)=14个字,符合30字内但需要以分布式事务专家的口吻,可能加一些专业术语例如:分布式事务下的数据洪流实时掘金与智能处理革新或者:实时掘金:分布式事务智能处理引领数据洪流革新nn更合适:分布式事务专家视角:数据洪流实时掘金,智能处理革新行业但字数略多nn最佳:数据洪流实时掘金:分布式事务智能处理引领革新字数:数据洪流实时掘金(7? 数据(2)洪流(2)实时(2)掘金(2)=8? 不对,汉字每个字算一个,数据洪流实时掘金:6个字+冒号+分布式事务智能处理引领革新:11个字,共17个字符合nn或者更短:实时掘金数据洪流:分布式事务智能革新共11个字nn考虑到要体现“专家”口吻,可以加“专家谈”之类的,但可能超过30字直接一个标题,不用加“专家”二字,但内容体现分布式事务即可我选择:数据洪流实时掘金:分布式事务智能处理引领行业革新这个标题直接包含了原题中的元素,并且加入了“分布式事务”体现专家口吻字数:数据洪流实时掘金(6)+冒号+分布式事务智能处理引领行业革新(13)=19个字,符合输出这个
系统维护员:运营中心模块化设计与动态配置优化,reasoning_content:我们要求以系统维护员的口吻,写一个与技术、科技相关,关于[运营中心产品升级:模块化设计与动态配置策略优化]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn思考:需要体现系统维护员的身份,同时围绕模块化设计和动态配置策略优化可以包含“系统维护员”这个词,或者用第一人称口吻例如:“系统维护员视角:模块化设计助力动态配置优化”但字数可能超?计算一下:系统维护员视角:模块化设计助力动态配置优化(共18字,符合)或者更简洁:“维护员手记:模块化+动态配置升级”也可以考虑“系统维护员解读:运营中心产品升级新策略”但要求是标题,要直接nn更贴合“口吻”的,比如“系统维护员:模块化设计与动态配置策略优化实践”,但字数可能超?数一下:系统维护员:模块化设计与动态配置策略优化实践(共20字,符合)但可以更精炼nn考虑用“系统维护员谈:模块化与动态配置优化”,但少了运营中心产品升级原文有“[运营中心产品升级:模块化设计与动态配置策略优化]”,需要体现这个主题nn最终选一个:系统维护员:运营中心产品升级之模块化与动态配置优化(共22字)或者“系统维护员看产品升级:模块化设计+动态配置策略优化”(22字)更好的是:“系统维护员解读:模块化设计驱动动态配置优化”(17字,但少了运营中心)可以加“运营中心”三字:“系统维护员解读运营中心:模块化与动态配置优化”(18字)或者“运营中心升级:系统维护员谈模块化与动态配置策略”(20字)nn鉴于要求“以’系统维护员’的口吻”,最好标题开头就是“系统维护员”之类的同时简洁考虑:系统维护员:模块化设计与动态配置策略优化(17字,但缺少运营中心)可改为“系统维护员:运营中心模块化与动态配置升级”(17字)再改“系统维护员:运营中心产品升级策略优化”(15字,但没提模块化和动态配置)需要包含这两个关键词nn最终确定:系统维护员:模块化设计+动态配置策略优化(16字,但没体现运营中心)或者“运营中心升级:系统维护员谈模块化与动态配置”(18字)这个可以nn我觉得直接输出:“系统维护员:运营中心模块化设计与动态配置优化” 共19字好
17 9 月 2026, 周四

【Python爬虫数据分析】2018年电影,你看了几部?

副标题#e#

12月已开始了,离2018年的结束也就半个多月的时间了,还记得年初立下的flag吗?

完成了多少?相信很多人和我一样,抱头痛哭…

本次利用猫眼电影,实现对2018年的电影大数据进行分析。

【Python爬虫&数据分析】2018年电影,你看了几部?

一、网页分析

01 标签

【Python爬虫&数据分析】2018年电影,你看了几部?

通过点击猫眼电影已经归类好的标签,得到网址信息。

02 索引页

【Python爬虫&数据分析】2018年电影,你看了几部?

打开开发人员工具,获取索引页里电影的链接以及评分信息。

索引页一共有30多页,但是有电影评分的只有10页。

本次只对有电影评分的数据进行获取。

03 详情页

【Python爬虫&数据分析】2018年电影,你看了几部?

对详情页的信息进行获取。

主要是名称,类型,国家,时长,上映时间,评分,评分人数,累计票房。

二、反爬破解

【Python爬虫&数据分析】2018年电影,你看了几部?

通过开发人员工具发现,猫眼针对评分,评分人数,累计票房的数据,施加了文字反爬。

【Python爬虫&数据分析】2018年电影,你看了几部?

通过查看网页源码,发现只要刷新页面,三处文字编码就会改变,无法直接匹配信息。

所以需要下载文字文件,对其进行双匹配。

  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格式文件(左右两块),你就会发现有对应信息。

【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) 

三、数据获取

#p#副标题#e#

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 

因为索引页和详情页请求头不一样,这里为了简便,构造了一个函数。

#p#副标题#e##p#分页标题#e#

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 

#p#副标题#e#

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 

四、数据存储

#p#副标题#e##p#分页标题#e#

01 创建数据库及表格

  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)。

#p#副标题#e#

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年电影,你看了几部?

五、数据可视化

可视化源码就不放了,公众号回复电影即可获得。

01 电影票房TOP10

【Python爬虫&数据分析】2018年电影,你看了几部?

还剩一个多月,不知道榜单上会不会有新成员。最近「毒液」很火,蛮有希望。

#p#副标题#e##p#分页标题#e#

02 电影评分TOP10

【Python爬虫&数据分析】2018年电影,你看了几部?

这里就得吐槽一下pyecharts,坐标转换后,坐标值名称太长就会被遮挡,还需改进呢~

03 电影人气TOP10

【Python爬虫&数据分析】2018年电影,你看了几部?

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

04 每月电影上映数量

【Python爬虫&数据分析】2018年电影,你看了几部?

每月上映数好像没什么大差距,7月最少,难道是因为天气热?

#p#副标题#e#

05 每月电影票房

【Python爬虫&数据分析】2018年电影,你看了几部?

这里就看出春节档电影的威力了,金三银四、金九银十,各行各业的规律,电影行业也不例外。

上一张图我们知道7月份电影上新最少,票房反而是第二。

这里看了下数据,发现有「我不是药神」「西虹市首富」「邪不压正」「摩天营救」「狄仁杰之四大天王」几部大剧撑着。

06 各国家电影数量TOP10

【Python爬虫&数据分析】2018年电影,,你看了几部?

原来中国电影这么高产的,可是豆瓣TOP250里又有多少中国电影呢?深思!!!

07 中外票房对比

【Python爬虫&数据分析】2018年电影,你看了几部?

2017年的年度票房是560亿,估计今年快要突破了。据说今年全年票房有望突破600亿。

08 电影名利双收TOP10

【Python爬虫&数据分析】2018年电影,你看了几部?

计算公式是,把某部电影的评分在所有电影评分中的排名与这部电影的票房在所有票房中的排名加起来,再除以电影总数。

除了「侏罗纪世界2」「无双」「捉妖记2」,我都看过啦!

09 电影叫座不叫好TOP10

【Python爬虫&数据分析】2018年电影,你看了几部?

计算公式是,把某部电影的票房排名减去某部电影的评分排名加起来,再除以电影总数。

可能是猫眼的用户比较仁慈吧,与豆瓣相比,普遍评分都比较高。我个人都不太敢相信这个结果。

不过有一个还是挺准的,「爱情公寓」。

10 电影类型分布

【Python爬虫&数据分析】2018年电影,你看了几部?

剧情电影永远引人深思。感觉今年的电影好多跟钱有关,比如「我不是药神」「西虹市首富」「一出好戏」「头号玩家」,贫穷限制了大家伙们。

【编辑推荐】

  1. Python数据可视化:2018年北上广深空气质量分析(附完整代码)
  2. Python数据可视化:2018年电影分析
  3. 以内部视角来观察10个数据分析的成功案例
  4. 从6730个微信用户中分析出大家的手机使用习惯
  5. Python数据可视化:浅谈数据分析岗

【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0

dawei

【声明】:天津站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。