站在网站管理的角度,若是在同一时间段,你们所有利用爬虫程序对本身的网站进行爬取操做,那么这网站服务器能不能承受这种负荷?确定不能啊,若是严重超负荷则会时服务器宕机(死机)的,对于一些商业型的网站,宕机一秒钟的损失都是不得了的,这不是一个管理员能承担的,对吧?那管理员会网站服务器作什么来优化呢?我想到的是,写一个脚本,当检测到一个IP访问的速度过快,报文头部并非浏览器的话,那么就拒绝服务,或者屏蔽IP等,这样就能够减小服务器的负担并让服务器正常进行。html
那么既然服务器作好了优化,但你知道这是对爬虫程序的优化,若是你是用浏览器来做为一个用户访问的话,服务器是不会拦截或者屏蔽你的,它也不敢拦你,为何,你如今是客户,它敢拦客户,不想继续经营了是吧?因此对于若是是一个浏览器用户的话,是能够正常访问的。python
因此想到方法了吗?是的,把程序伪形成一个浏览器啊,前面说过服务器会检测报文头部信息,若是是浏览器就不正常通行,若是是程序就拒绝服务。浏览器
那么报文是什么?头部信息又是什么?详细的就不解释了,这涉及到http协议和tcp/ip三次握手等等的网络基础知识,感兴趣的本身百度或者谷歌吧。服务器
本篇博文不扯远了,只说相关的重点——怎么查看头部信息。网络
其实我想有些朋友可能有疑惑,服务器是怎么知道咱们使用的是程序或者浏览器呢?它用什么来判断的?tcp
我使用的是火狐浏览器,鼠标右键-查看元素(有的浏览器是审查元素或者检查)工具
网络(有的是network):优化
出现报文:网站
双击它, 右边则会出现详细的信息,选择消息头(有的是headers)url
找到请求头(request headers),其中的User-Agent就是咱们头部信息:
看到是显示的
# -*- coding:utf-8 -*- import urllib url='http://www.baidu.com' #百度网址 html=urllib.urlopen(url)#利用模块urllib里的urlopen方法打开网页 print(dir(html)) #查看对象html的方法 print(urllib.urlopen) #查看对象urllib.urlopen的方法 print(urllib.urlopen()) #查看对象urllib.urlopen实例化后的方法
Traceback (most recent call last): File "D:\programme\PyCharm 5.0.3\helpers\pycharm\utrunner.py", line 121, in <module> modules = [loadSource(a[0])] File "D:\programme\PyCharm 5.0.3\helpers\pycharm\utrunner.py", line 41, in loadSource module = imp.load_source(moduleName, fileName) File "G:\programme\Python\python project\test.py", line 8, in <module> print(urllib.urlopen()) TypeError: urlopen() takes at least 1 argument (0 given) ['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'code', 'fileno', 'fp', 'getcode', 'geturl', 'headers', 'info', 'next', 'read', 'readline', 'readlines', 'url'] <function urlopen at 0x0297FD30>
urlopen提供了以下方法:
好的,详细的本身去研究了,本篇博文的重点终于来了,假装一个头部信息
因为urllib没有伪造头部信息的方法,因此这里得使用一个新的模块,urllib2
# -*- coding:utf-8 -*- import urllib2 url='http://www.baidu.com' head={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' } #头部信息,必须是一个字典 html=urllib2.Request(url,headers=head) result=urllib2.urlopen(html) print result.read()
或者你也能够这样:
# -*- coding:utf-8 -*- import urllib2 url='http://www.baidu.com' html=urllib2.Request(url) html.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0') #此时注意区别格式 result=urllib2.urlopen(html) print result.read()
结果都同样的,我也就不展现了。
按照上面的方法就能够伪造请求头部信息。
那么你说,我怎么知道伪形成功了?还有不伪造头部信息时,显示的究竟是什么呢?介绍一个抓包工具——fidder,用这个工具就能够查看到底报文头部是什么了。这里就不展现了,本身下去常识了。而且我能够确切的保证,确实伪形成功了。
这样,咱们就把爬虫代码升级了一下,能够搞定普通的反爬虫限制