前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬取电影网站票房信息并进行数据可视化

爬取电影网站票房信息并进行数据可视化

作者头像
石璞东
发布2019-07-26 14:44:24
1.7K0
发布2019-07-26 14:44:24
举报

本文章适合有编程基础的人和对于编程有浓厚兴趣的人作为参考,本篇文章仅涉及简单的反爬措施(协议头信息),不涉及IP代理、登陆等高端的措施,还涉及几个较为常用的模块(requests,matplotlib等),如想了解更多信息,请参考我的另一篇推文.

项目名称:

猫眼电影数据爬取及其可视化

1.实际需求:

通过爬取某国内知名电影网站获取其电影票房信息,并进行数据的可视化.

2.项目成本分析:

实用度:0%

难度:0%

时间消耗:1 h

个人能力提升:100%

综合分析,你值得拥有

3.项目思路:

1.分析爬取网站的信息

(涉及到的模块:request)

2.获取有用信息

3.进行展示(涉及到的模块:matplotlib)

4.本文涉及到的知识点:

HTTP协议

浏览器控制台的使用

对于所用模块有一定的了解(重点对于requests<urllib2或urllib3也行>和matplotlib有一定的了解)

5.基础知识:

什么叫爬虫:度娘是这样说的,网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫.用人话来说就是,爬虫就是再海量的数据里面,通过一些正规或者更正规手段

挑选对自己有用的信息,然后根据个人不同需要对其做不同的处理.

常见的反爬措施:

1.协议头

即通过:

   headers = {
       'accept':'*/*',
      'accept-encoding':'gzip, deflate, sdch, br',
      'accept-language':'zh-CN,zh;q=0.8',
      'origin':'https://piaofang.maoyan.com',
      'referer':'https://piaofang.maoyan.com/dashboard',
      'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
                  (KHTML, like Gecko) Chrome/58.0.3029.110 
                  Safari/537.36 SE 2.X MetaSr 1.0'
  }

的形式,偷偷告诉你们,其中user-agent是大部分网站反爬措施协议头里面必须加的键值对,不信就一个一个试呗

2.IP封锁

不到万不得已某些大公司,比如说某度,某宝等等,不会对IP进行长时间的封锁.常见的网站反爬虫首先考虑到会不会对用户产生误伤,举个贴近咱们学生党的例子,在校园网内,有台机器对网站持续高频繁产生请求,校园网涉及用户过多,如果粗暴的封锁IP势必会对校园中无辜的小伙伴产生误伤,无疑会损失许多用户量,这对于公司来说是致命的啊. 考虑两个极端的例子,假设(听好了,是假设哦)我可以在一秒内访问某度的网站1000000000000.......次(我可以做到如此的手速,网速也处于理想的状态下,某度的服务器也能承受此压力),试问对方服务器会一直让你访问下去吗?肯定不会啊,此时肯定会封你的IP啊,让你手速这么快

;第二个例子,采用最笨的方法,我找1000000000000......个好哥们,并给他们一人配备一台高配的电脑,千兆的带宽

,他们要做的是在某一秒之内同时访问某度的同一台服务器,这会封IP吗?肯定不会了,对方服务器肯定认为是在这一时刻,多用户在正常的访问他们的网站,这是增加点击量和知名度呢.话说,也没有人这么无聊干这种事,是吧!~~~~~~

针对IP封锁的两种解决方法:

修改程序访问的频率:

#引入impor time
#休息两秒time.sleep(2)

采用IP代理:

  #导入requests库,如果使用其他的自行导入
  import requests
   proxies = {
    "http": "http://127.0.0.1:8888",
   "https": "http://127.0.0.11:1080",
   }
  requests.get(url, proxies=proxies)

3.其他的措施比如:验证码机制、登陆什么高端的做法,小编还没有详细的了解过呢,如果有小伙伴了解过,请Q我哦,联系方式在下方呢

6.浏览器控制台的使用:

猫眼电影专业版-实时票房:https://piaofang.maoyan.com/dashboard 按下F12或点击鼠标右键选择"审查元素",点击Network项,选中XHR。

7.网站数据实时更新的思路:

打开开发者工具,刷新当前页面,会发现出现了"second.json"的响应信息,仔细观察页面,会发现页面中“综合票房”的数据是实时更新的,那么这是怎么实现的呢?很简单,每当服务器的相关数据发生改变,就会向客户端发送响应,客户端收到响应之后,就会根据服务端的返回结果重新渲染,即直接更改页面的内容(这也就是为什么再控制台能看到不停的有second.json的数据包发送过来).所以,我们该怎么做到实时更新网站的数据并将它展示出来呢,很简单,既然服务器自己检测到数据改变后就会主动告诉客户端,那么我们只需要向客户端(本处指"浏览器")发送请求,即可请求到最新的数据包了,对的,就是这么简单.

重磅炸弹哟 24k纯干货 话不多说,直接上代码

8.源码展示:

    import requests
   import matplotlib as mpl
   import matplotlib.pyplot as plt
   import time
   import pylab as pl
   import sys
   #一般网站最基本的反爬措施,伪装协议头headers
    headers = {
       'accept':'*/*',
      'accept-encoding':'gzip, deflate, sdch, br',
      'accept-language':'zh-CN,zh;q=0.8',
      'origin':'https://piaofang.maoyan.com',
      'referer':'https://piaofang.maoyan.com/dashboard',
      'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)
              AppleWebKit/537.36
              (KHTML, like Gecko) Chrome/58.0.3029.110 
              Safari/537.36 SE 2.X MetaSr 1.0'
    }
   #保证中文输出时不会乱码
   mpl.rcParams["font.sans-serif"]=["SimHei"]
   mpl.rcParams["axes.unicode_minus"]=False
   #要爬取网站的url
   url = "https://box.maoyan.com/promovie/api/box/second.json"
   #用来存获取到的电影票房数据
   arr = []
   #记录横坐标的数据
   a = []
   #记录电影的名字
   movie_name = []

   #爬取电影网站票房信息
   def acquireInfo():
       res = requests.get(url, headers=headers)
       res_con = res.json()
       for item in res_con["data"]["list"]:
           arr.append(item["boxInfo"])
           movie_name.append(item["movieName"])
       for i in range(1, 26):
           a.append(i)
       drawChart(movie_name)

   #依据信息画图展示
   def drawChart(str):
       plt.bar(a,arr,align="center",color="#7FFF00",tick_label=str)
       #使y轴坐标文字标签正常显示
     pl.xticks(rotation=-90)
       #设置图标的主题文字
     plt.title("猫眼电影实时票房信息")
       #设置x y 轴的名称
     plt.xlabel('电影名称')
       plt.ylabel('电影票房')
       plt.show()

   #显示进度条
   def view_bar(num, total):
       rate = num / total
       rate_num = int(rate * 100)
       r = ' \r %s>%d%%' % ('=' * num, rate_num,)
       sys.stdout.write(r)
       sys.stdout.flush()


   if __name__ == '__main__':
       for i in range(0, 101):
           time.sleep(0.1)
           view_bar(i, 100)
       print("数据加载完成!")
       while 1:
           acquireInfo()
           #每0.1s请求一次网站,做到实时数据的刷新
        time.sleep(1)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 hahaCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档