一、什么是浏览器伪装技术
有一些网站为了避免爬虫的恶意访问,会设置一些反爬虫机制,常见的饭爬虫机制主要有:
1、通过分析用户请求的Headers信息进行反爬虫
2、通过检测用户行为进行反爬虫,比如通过判断同一个IP在短时间内是否频繁访问对应网站等进行分析
3、通过动态页面增加爬虫的爬取难度,达到反爬虫的目的
第一种反爬虫机制在目前网站中应用的最多,大部分反爬虫网站会对用户请求的Headers信息的“User-Agent”字段进行检测来判断身份,有时,这类反爬虫的网站还会对“Referer”字段进行检测。我们可以在爬虫中构造这些用户请求的Headers信息,以此将爬虫伪装成浏览器,简单的伪装只需设置好“User-Agent”字段的信息即可,如果要进行高相似度的路蓝旗伪装,则需要将用户请求的Headers信息中常见的字段都在爬虫中设置好
第二种反爬虫机制的网站,可以通过之前学习的使用代理服务器并经常切换代理服务器的方式,一般就能够攻克限制
第三种反爬虫机制的网站,可以利用一些工具软件,比如selenium+phantomJS,就可以攻克限制
二、浏览器伪装准备
通过Fiddler,访问爱奇艺网站,获取头部信息,如下
字段的格式,基本格式为:“字段名”:”字段值”
字段名和对应的值之间通过”:”隔开
常见头信息字段的含义:
常见字段1: Accept: text/htnl, application/xhtml+xml, application/xmlq=0.9,中/*;q=08
- Accept字段主要用来表示浏览器能够支持的内容类型有哪些。
- text html表示HTMⅡL文档。
- application/ xhtml+xm表示 XHTML文档。
- application/xml表示XMAL文档。
- q代表权重系数,值介于0和1之间。
所以这一行字段信息表示浏览器可以支持 text/html,application/xml、/等内容类型,支持的优先顺序从左到右依次排列。
常见字段2: accept-encoding:gzip, deflate
- accept-encoding字段主要用来表示浏览器支持的压缩编码有哪些。
- gzip是压缩编码的一种。
- deflate是一种无损数据压缩算法。
这一行字段信息表示浏览器可以支持gzp、 deflate等压缩编码。
常见字段3: Accept- Language:zhCN,zh;q=0.8,en-US;q=0.5,cnq=0.3
- Accept-language主要用来表示浏览器所支持的语言类型。
- zh-CN表示简体中文语言。zh表示中文,CN表示简体
- en-Us表示英语(美国)语言
- en表示英语语言
所以之一行字段表示浏览器可以支持zh-CN、zh、en-US、cn等语言。
常见字段4:User- Agent: Mozilla5.0( Windows NT61;WOw64;rv:47.0) Gecko20100101Firefox/47.0
- user-agent字段主要表示用户代理,服务器可以通过该字段识别出客户端的浏览器类客户端的操作系统及版本号型、浏览器版本号主要以伪造该字段进行网页排版引擎等客户端信息。所以之前要模拟浏览器登录,主要以伪造该字段进行。
- Mozilla5.0表示浏览器名和版本号
- Windows NT61;WOw64;rv:47.0 表示客户端操作系统对应信息
- Gecko表示网页排版引擎对应信息。
- Firefox/47.0表示火狐浏览器
所以这一行字段表示信息为对应的用户代理信息是Mozilla5.0( Windows NT61;WOw64;rv:47.0) Gecko20100101Firefox/47.0
常见字段5: Connection:keep-alve
- Connection表示客户端与服务器的连接类型,对应的字段值主要有两种
- keep-alive表示持久性连接。
- close表示单方面关闭连接,让连接断开。
所以此时,这一行字段表示客户端与服务器的连接是持久性连接。
常见字段6:Host: wwwyouku.con
- Host字段表示请求的服务器网址是什么,此时这一行字段表示请求的服务器网址是www,youku,con。
常见字段7: Referer:网址
- Referer字段主要表示来源网址地址,比如我们从htp:/ www,youku.conm网址中访问了该网址下的子页面http/tvyouku.com?spm=0.0.topnav.5-1-3!2-A.Onqoef,那么此时来源网址为htp:/ www,youku,con,即此时 Referer字段的值为http:/ww
youku. com
三、爬虫伪装浏览器实战
1、使用代理服务器
import urllib.request
import http.cookiejar
url = "http://news.163.com/18/0306/09/DC71LRR20001875N.html"
# 以字典的形式设置headers
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
# "Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
"Connection": "keep-alive",
"referer": "http://www.163.com"
}
#设置cookie
cjar = http.cookiejar.CookieJar()
proxy = urllib.request.ProxyHandler({'http': "127.0.0.1:8888"})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler, urllib.request.HTTPCookieProcessor(cjar))
# 建立空列表,为了以制定格式存储头信息
headall = []
for key,value in headers.items():
item = (key, value)
headall.append(item)
# 将制定格式的headers信息添加好
opener.addheaders = headall
# 将opener安装为全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
# data = data.decode("utf-8")
fhandle = open("D://testweb/part6/1.html", "wb")
fhandle.write(data)
fhandle.close()
注意:
1、”Accept-Encoding”: “gzip, deflate
这句话的意思是本地接收压缩格式的数据,服务器传过来压缩格式gzip的文件,而解压这种gzip文件只能用deflate算法,浏览器能够自动解压,程序却不能自动解压gzip,需要额外进行设置才行,
总结:写爬虫程序时候还是不要写’Accept-Encoding’: ‘gzip, deflate’了,就让服务器传原始文件过来吧,不用压缩了。
2、使用Fiddler作为代理,所爬取的网址要以具体文件或者“/”结尾,如果有具体文件,直接写该具体文件的网址即可。
3、referer字段的值一般可以设置为要爬取的网页的域名地址或者对应网站的主页地址。
2、不使用代理伪装浏览器
import urllib.request
import http.cookiejar
url = "http://www.baidu.com"
# 以字典的形式设置headers
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
# "Accept-Encoding": "gzip, deflate",
"Accept-Encoding": "gb2313,utf-8",
"Accept-Language": "zh-CN,zh;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
"Connection": "keep-alive",
"referer": "baidu.com"
}
#设置cookie
cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall = []
# 将制定格式的headers信息添加好
for key,value in headers.items():
item = (key,value)
headall.append(item)
opener.addheaders = headall
# 将opener安装为全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
fhandle = open("D://testweb/part6/2.html", "wb")
fhandle.write(data)
fhandle.close()