一些网站会设置一些反爬策略来限制爬取数据,所以就需要让爬虫伪装成浏览器取爬取数据
常见的反爬机制主要有,分析用户请求的Headrest信息反爬、检测用户行为比如同一IP频繁访问网站、页面的动态加载反爬,
第一种比较常见,本章也主要记述这一种反爬的应对方法,就是User-Agent字段进行检测,当然除了这个字段还会检测其他字段,我们就通过程序伪装一个headers信息
第二种用代理服务器也可以解决
第三种就需要借助一些工具软件了
Fiddler
要伪造headrest信息就得先知道这个信息是什么样的,这个我们可以用Fiddler来进行抓包分析,这个软件可以到官网下载安装
使用前需在浏览器上设置代理服务器
右侧的就是拿到的headers信息,这里简单介绍一下这几项的含义
Accept 主要用来表示浏览器能够支持的内容类型,p代表权重数介于0和1之间
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.
Accept-Encoding字段主要表示浏览器可以支持的压缩编码有哪些,因为从网站请求回的数据其实是一个个的压缩数据包需要解压才能读取
Accept-Encoding: gzip, deflate, sdch
Accept-Language字段表示浏览器支持的语言类型,zh-CN是中文,en-US英语美国,en英语
Accept-Language: zh-CN,zh;q=0.8
User-Agent字段主要表示用户代理,服务器可以从这个字段识别出客户端的浏览器类型、版本、客户端的操作系统和版本号、页面排版等信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Connection字段表示客户端与服务器的链接类型,有持久链接和单方面关闭链接,让连接断开。下面这个是持久链接
Connection: keep-alive
Host字段是服务器的主机域名或网址
Host: www.youku.com
Referer字段表示来源网址地址,比如从www.youku.com网址中访问它下面的一个二级页面,那这时来源网址就是www.youku.com
Referer: http://www.so.com/link?m=aA%2FPN0aNgCf2wtuVBZk%2FDaOweq2IuAfGOGbQk5hQZqEZIJcWdlpC%2F85Lj%2BMQTElZpU1qaH6Oz6CTllMIMsLCpcDJM0JIVDXM
好了,现在让我们开始编写伪装浏览器的程序
import urllib.request
import http.cookiejar
url='http://war.163.com/photoview/4T8E0001/2281894.html'
#以字典形式设置hesders,格式是[(字段名,字段值),(字段名,字段值)],这里先用字典,在下面会用for把它转为列表元组的形式
h={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Connection':'keep-alive',
'referer':'http://www.163.com/'}
#设置cookie
cj=http.cookiejar.CookieJar()
proxy=urllib.request.ProxyHandler({'http':'127.0.0.1:8888'})#这里设置代理服务器是为了方便Fiddler抓包,实际可以这里可以省去
op=urllib.request.build_opener(proxy,urllib.request.HTTPHandler,urllib.request.HTTPCookieProcessor(cj))#将代理服务器和headrest信息,作为一个对象赋给op
headall=[]#建立空列表,构造出指定格式的headers信息
for key,value in h.items():#循环字典h,每次循环提取一个键值对
item=(key,value)#把提取到的键值对,做成元组赋予item
headall.append(item)#添加到列表中
op.addheaders=headall #将指定格式的headrest信息添加好
urllib.request.install_opener(op)#安装为全局,下面直接用urllib时就自动把op的对象加进去了
print(headall)
data=urllib.request.urlopen(url).read()
f=open('D:/AuI18N/5.html','wb')
f.write(data)
f.close()
其实这个网页没有设置反爬设置,我把设置headrest信息的部分全部注释掉,一样可以爬到数据,但是在真实爬取网页时,你并不知道那是网站有反爬策略那些网站没有反爬策略,所以为了保险就都把伪装的部分加上
需要注意的几点:
1)代码里没有设置Accept-Encoding字段,如果设置为gzip或deflate就可能报错,此时改成utf-8或gb2312就好了,或者干脆不设置这个字段信息,因为入设置了压缩编码,那么请求的数据就是压缩数据包需要解压才行,但这是伪装的浏览器没有解压功能的程序,所以就不用多此一举
2)用Fiddler做代理服务器爬取网页时,网址要以具体文件名或者‘/’结尾
3)referer字段一般设置为要爬取网页的域名地址或对应网站的主页