urllib+requests+猫眼电影票房信息可视化

简介: 10年前,小ha刚开始接触电脑,他很菜(:就和现在的我一样菜,他最喜欢的事就是敲键盘上的Enter键,因为他觉得敲完Enter键之后,神清气爽,醍醐灌顶


前言


免费请你们坐时光机,我们穿越到十年前~


10年前,小ha刚开始接触电脑,他很菜(:就和现在的我一样菜,他最喜欢的事就是敲键盘上的Enter键,因为他觉得敲完Enter键之后,神清气爽,醍醐灌顶(:这两个成语用的,是不是很有文化的样子,好评~


自己买票,我们坐时光机回来


现在帅气漂亮的你坐在电脑前,面对Baidu或者Google的搜索界面,有没有想一下,当你键入关键词(:比如"石璞东"之后,为什么要按下Enter键呢(:别跟我抬杠啊,我知道肯定会有人说:我就不,我就用鼠标,哈,随你?按下Enter键之后又发生了什么不为人知的勾当呢?


其实简单一句话概括:Enter键或者鼠标点击的作用是向对应的服务器发送HTTP请求,那么问题来了,用Python可以发请求嘛?答案是当然可以,(:用普通话说就是,Python除了不能怀孕,其它都可以今天这篇文章,我们就走近科学,解开敲Enter键背后的原理。


1 相关知识介绍



假设小ha想要刷会儿剧,比如说:看岳云鹏的相声集,那么他有两种方法 :



  • 在PC上通过浏览器进入腾讯视频官网进行查看

  • 安装腾讯视频客户端

(:别抬杠哟,这两种方法只是为了解释以下知识点。


ok,分析下,从大的层面来讲,用户访问互联网资源有两种模式 : BS模式(browser-server)和CS模式(client–server)。


BS模式means:用户只需要安装一个浏览器就可以访问互联网上所有的内容(刚说的通过腾讯视频网页端观看岳云鹏相声集就是BS模式)。


CS模式means:用户必须通过相应的客户端才能访问对应的互联网资源(也就是上面例子中的安装腾讯视频客户端)。


建议大家多多在PC端用浏览器访问互联网,理由很简单:


  1. 客户端产品可以充分利用硬件本地的资源和特点,能实现更多的效果,而网页版由于不能充分利用硬件本地化的资源,效果和交互逊于客户端版本(现在随着Html5的应用,利用终端机来实现更好的效果和交互的梦想不遥远了);

  2. 户端产品需要根据不同硬件、系统进行定制,而网页版则不需要(仅需要考虑不同浏览器的适配问题即可);

  3. 客户端产品的升级比较麻烦,而网页版升级容易(:升级意味着流量,这钱省下来给老婆买Dior、买Chanel不好嘛;

  4. 客户端产品的问题定位比较复杂,要全面考虑到用户的软硬件环境。


不管是BS还是CS模式,从大的范围来讲,这种方式都可以笼统概括为:客户端请求 服务端响应


2 urllib模块的使用


urllib库是Python中的一个功能强大、用于操作URL,并在做爬虫的时候经常要用到的库。在Python2.x中,分为urllib库和urllib2库,Python3.x之后都合并到urllib库中。


1. 抓取个人网站主页代码


import urllib.request
response = urllib.request.urlopen("http://www.shipudong.com/")
print(response.read().decode("utf-8"))


微信图片_20220610203952.jpg

  • urlopen方法的几个参数:


  • data
import urllib.parse
import urllib.request
#data参数是可选的,如果要添加参数,并且如果它是字节流编码格式的内容,即bytes类型,则需要bytes()方法转化
data = bytes(urllib.parse.urlencode({"word":"hello"}),encoding="utf-8")
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())
  • timeout


import urllib.request
response = urllib.request.urlopen("http://www.shipudong.com/",timeout=1)
//程序超过1秒后,如果服务器没有请求,就会抛出URLError异常
print(response.read())
  • 几个高级用法


  • HTTPDefaultErrorHandler : 用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常
  • HTTPRedirectHandler : 用于处理重定向
  • HTTPCookieProcessor : 用于处理cookies
  • ProxyHandler : 用于设置代理,默认代理为空
  • HTTPPasswordMgr : 用于管理密码,它维护了用户名和密码的表
  • HTTPBasicAuthHandler : 用于管理认证,如果一个链接打开的时候需要认证,那么可以用它来解决验证问题

  • 这里我举两个栗子简单说明:


  • HTTPBasicAuthHandler
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = "username"
password = "password"
url = "http://localhost:5000/"
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
try:
    result = opener.open(url)
    html = result.read().decode("utf-8")
    print(html)
except URLError as e:
    print(e.reason) 

「注」: 上述代码是在本地开启一个服务端口,所以各位在自己本机上试验时,务必关掉防火墙和安全卫士这些东西,否则会一直报错滴~


  • 代理


      比伪装信息头更高端一点的方法就是使用IP代理池,因为对于一个网站来说,如果检测到某一个IP对于本网站的请求次数过多,就会对其实行IP封锁。


    ok,那这不是思路就又来了么,你敢检测我IP,那我就访问几次换个新的IP接着访问(俗称:打一枪,换个地儿继续打,八路军游击战就是厉害


from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ({
    //这里是你买的IP代理池
    //一般这样写:"http":"ip地址"或者"https":"ip地址"
})
opener = build_opener(proxy_handler)
try:
    response = opener.open("http://www.shipudong.com/")
    print(response.read().decode("utf-8"))
except URLError as e:
    print(e.reason)

IP代理推荐:https://www.kuaidaili.com/


2.错误处理(error模块)


不用多说了吧,上面的几个例子中都使用了错误处理。请参考上述内容。


3.解析链接(parse模块)


urllib库里面提供了parse模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取、合并以及链接转换。


from urllib.parse import urlparse
result = urlparse("http://www.shipudong.com/2019/05/03/python-ku-zhi-selenium-de-shi-yong/")
print(type(result),result)

我们去看看控制台:



<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.shipudong.com', path='/2019/05/03/python-ku-zhi-selenium-de-shi-yong/', params='', query='', fragment='')


其余的API这里不再赘述,大家去官网进行深入学习。


官网地址:


https://docs.python.org/3/library/urllib.parse.html#module-urllib.parse


4.分析Robots协议(robotparser模块)


Robots协议也叫爬虫协议、机器人协议,它的全名叫网络爬虫标准排除(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个robots.txt的文本文件,一般放在网站的根目录下。


因为我自己的网站没有这个协议,所以我以简书网站为例,简单说下其中各字段代表的意思:


地址:https://www.jianshu.com/robots.txt


微信图片_20220610204005.jpg

推荐大家一个自动生成robots.txt文件的网站:

http://tool.chinaz.com/robots/


3 requests模块的使用


Requests是Python中的HTTP客户端库,网络请求更加直观方便,它与urllib最大的区别就是在爬取数据的时候连接方式的不同。urllib爬取完数据是直接断开连接的,而requests爬取数据之后可以继续复用socket,并没有断开连接。个人比较推荐使用requests方式。


看一下代码演示,默默感受一下和urllib的不同,然后带你体验一下小清新的感觉~


#你得确保你安装了requests这个库哟
import requests
url = "http://www.shipudong.com/"
result = requests.get(url)
print(type(result))
print(result.status_code)
print(result.text)
print(result.cookies)



官网地址:

https://2.python-requests.org//zh_CN/latest/user/quickstart.html


4 实战应用-猫眼电影票房信息数据可视化




我们要分析的是下面的页面:


地址:https://piaofang.maoyan.com/dashboard


微信图片_20220610204015.jpg


访问上述页面,我们打开浏览器控制台看看到底发生了什么:


微信图片_20220610204024.jpg


思路:


间隔一定时间(我的代码中间隔1秒)请求一次实时票房的网址并获取新的票房数据信息,然后取出相关字段的值,最后把新数据通过Python的2D绘图库-Matplotlib将其渲染出来。


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)


相关文章
|
6月前
|
Perl
pythonSpider_requests获取豆瓣音乐信息写入csv
pythonSpider_requests获取豆瓣音乐信息写入csv
52 0
|
6月前
|
Python
pythonSpider_urllib获取豆瓣电影top250信息写入excel
pythonSpider_urllib获取豆瓣电影top250信息写入excel
58 0
|
3月前
|
数据采集 存储 数据可视化
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
本文介绍了一个基于Python Flask框架开发的猫眼电影票房数据分析可视化系统,该系统集成了数据爬取、存储处理、可视化展示和用户交互功能,使用户能够直观地分析和展示电影票房数据,具有高度定制性。
140 0
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
|
6月前
|
数据采集 Web App开发 数据可视化
Python爬取猫眼电影专业评分数据中的应用案例
Python爬取猫眼电影专业评分数据中的应用案例
|
数据采集 XML 存储
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
这个案例展示了如何使用 Scrapy 框架构建一个简单的爬虫项目,从网页中提取数据并保存到文件中。通过配置、编写爬虫代码、定义数据模型和数据处理管道,你可以灵活地构建各种爬虫应用。
311 0
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
|
机器学习/深度学习 数据采集 存储
基于django的二手房交易预测及展示系统
基于django的二手房交易预测及展示系统
397 1
|
数据采集 数据可视化 Go
使用Pyecharts对猫眼电影票房可视化分析
使用Pyecharts对猫眼电影票房可视化分析
|
存储 数据采集 关系型数据库
python爬虫爬取房源信息
写这篇博客的原因是在我爬取房产这类数据信息的时候,发现csdn中好多博主写的关于此类的文章代码已经不适用,因为好多房产网站代码已经更改,使用老的代码明显爬取不到所需要的房产信息。......
241 1
python爬虫爬取房源信息
|
编解码 自然语言处理 数据可视化
COVID-19数据分析实战:WordCloud 词云分析
COVID-19数据分析实战:WordCloud 词云分析
COVID-19数据分析实战:WordCloud 词云分析
Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测
Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测
Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测