一.爬虫前言
在我们爬取一些网页的时候可能会失败,因为这写网站为了防止恶意爬虫的访问,会设置一些爬虫机制,常见的爬虫机有:
(1)通过分析用户请求的Headers信息进行反爬虫
(2)通过检测用户行为进行爬虫,比如通过判断同一个IP在短时间内是否频繁地访问一个网站
(3)通过动态页面增加爬虫的难度,达到反爬虫的目的
第一中反爬虫机制可以通过设置好用户的Headers信息还实现浏览器的伪装,第二种反爬虫的网站可以通过使用代理服务器并经常切换代理服务器的方式解决,第三种可以通过一些工具软件实现,这里我们主要介绍第一种
二.头信息的常见字段
但网络通过浏览器访问网站时,会向服务器发送一些Headers头信息,然后服务器根据用户的请求头信息生成一个网页内容,病将其返回给浏览器,所以服务器接受到这些头信息后可以根据头信息分析出该访问是不是爬虫
以下是Headers信息中常见的字段:
1.Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept 字段主要表示浏览器能够支持的内容类型有哪些
- text/html 表示HTML文档
- application/xhtml+xml 表示XHTML文档
- application/xml 表示XML文档
- q 代表权重系数,指介于0~9之间
所以这一行字段信息表示浏览器可以支持text/html ,applictaion/xhtml+xml ,applictaion/xml ,*/*等内容类型,支持的优先顺序从左到右
2.Accept-Encoding:gzip,deflate
- Accept-Encoding 终端主要表示浏览器支持的压缩编码
- gzip 压缩编码的一种
- deflate 一种数据无损压缩算法
这一字段表示浏览器支持的gzip,deflate等压缩方式
3.Accept-language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
- Accept-language 主要表示浏览器支持的语言类型
- zh-CN 简体中文,zh表示中文,CN表示简体
- en-US 表示(美国)英语
- en 表示英语
这一字段表示浏览器支持的语言类型
4.User-Agent:Mozilla/5.0 (Windows NT 6.1;WOW64;rv:47.0) Gecko/20100101 Firefox/47.0
- User-Agent 表示用户代理,服务器可以通过该字段识别浏览器类型和版本号,客户端的操作系统和版本号以及网页排版引擎等客户信息,所以美女浏览器访问主要是模拟该字段
- Mozilla/5.0 表示浏览器名称及版本信息
- Windows NT 6.1;WOW64;rv:47.0 表示客户端操作系统对于信息
- Gecko 表示网页排版引擎对于的信息
- firefox 表示火狐浏览器
5.Connection:keep-alive
- Connection 表示客户端与服务器的连接类型,对应的字段主要有两种:keep-alive,close
- keep-alive 表示持久性连接
- close 表示单方面改变连接,让连接断开
6.Host:www.youku.com
- Host 表示请求服务器的网站
7.Referer:网址
- Referer 字段表示来源网网址地址,就是但我们打开一个网站的子网页时,源网网址地址是第一个网页地址
三.爬虫浏览器伪装实战
伪装成浏览器,首先我们要设置好对应的Headers信息,我们可以通过opener.addheaders为爬虫添加头部信息
import urllib.request
import http.cookiejar
url="http://www.baidu.com"
headers={
"Aceept":"text/html,application/xhtml+xml,app;ication/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gb2312,utf-8",
"Accept-Language":"zh_CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWeb Kit/537.36 (KHTML,like GEcko) Chrome/38.0.2125.1222 Safari/537.36 SE 2X MetaSr 10",
"Connection":"keep-a;ive",
"referer":"baidu.com"
}
cjar=http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall=[]
for key,value in headers.items():
item=(key,value)
headall.append(item)
opener.addheaders=headall
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read()
fhandle=open("test.html","wb")
fhandle.write(data)
fhandle.close()
结果:下载了百度的网页,但伪装的头部信息里是widow操作系统但比如的是kali,所以伪装浏览器成功,但也可能是该网页没有拦截机制