本文章适合有编程基础的人和对于编程有浓厚兴趣的人作为参考,本篇文章仅涉及简单的反爬措施(协议头信息),不涉及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)