在我们爬取一些网页的时候可能会失败,因为这写网站为了防止恶意爬虫的访问,会设置一些爬虫机制,常见的爬虫机有:
(1)通过分析用户请求的Headers信息进行反爬虫
(2)通过检测用户行为进行爬虫,比如通过判断同一个IP在短时间内是否频繁地访问一个网站
(3)通过动态页面增加爬虫的难度,达到反爬虫的目的
第一中反爬虫机制可以通过设置好用户的Headers信息还实现浏览器的伪装,第二种反爬虫的网站可以通过使用代理服务器并经常切换代理服务器的方式解决,第三种可以通过一些工具软件实现,这里我们主要介绍第一种
但网络通过浏览器访问网站时,会向服务器发送一些Headers头信息,然后服务器根据用户的请求头信息生成一个网页内容,病将其返回给浏览器,所以服务器接受到这些头信息后可以根据头信息分析出该访问是不是爬虫
以下是Headers信息中常见的字段:
1.Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
所以这一行字段信息表示浏览器可以支持text/html ,applictaion/xhtml+xml ,applictaion/xml ,*/*等内容类型,支持的优先顺序从左到右
2.Accept-Encoding:gzip,deflate
这一字段表示浏览器支持的gzip,deflate等压缩方式
3.Accept-language:zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
这一字段表示浏览器支持的语言类型
4.User-Agent:Mozilla/5.0 (Windows NT 6.1;WOW64;rv:47.0) Gecko/20100101 Firefox/47.0
5.Connection:keep-alive
6.Host:www.youku.com
7.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,所以伪装浏览器成功,但也可能是该网页没有拦截机制