应对反爬的方法:
cookies池,更换cookie意味着更换用户
proxies池,更换proxy意味着更换IP
header中假装浏览器,加入User-Agent及Referer (这两种是今天学习的)
设置延迟,time.sleep(1)php
有些网站不会赞成程序直接用上面的方式进行访问,若是识别有问题,那么站点根本不会响应,因此为了彻底模拟浏览器的工做,咱们须要设置一些Headers 的属性html
有个Request URL,还有headers,那么这个头中包含了许许多可能是信息,有文件编码啦,压缩方式啦,请求的agent啦等等。其中,agent就是请求的身份,若是没有写入请求身份,那么服务器不必定会响应,因此能够在headers中设置agent,例以下面的例子,这个例子只是说明了怎样设置的headers,小伙伴们看一下设置格式就好。python
这样,咱们设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会获得响应。web
import urllib import urllib2 url="https://www.zhihu.com/signup?next=%2F" user_agent="Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)" values={"username":"15901106477","password":"wq12341234"} headers={"User-Agent":"user_agent"} date=urllib.urlencode (values) request=urllib2.Request(url,date,headers) response=urllib2.urlopen(request) print response.read()
http://blog.csdn.net/bone_ace/article/details/52476016此网站有各类浏览器版本信息windows
这样,咱们设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会获得响应。浏览器
referer安全
另外,咱们还有对付”反盗链”的方式,对付防盗链,服务器会识别headers中的referer是否是它本身,若是不是,有的服务器不会响应,因此咱们还能够在headers中加入referer服务器
import urllib import urllib2 url="https://www.zhihu.com/signup?next=%2F" user_agent="Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"#疑问,对于这个地方,在Linux和windows中都没可以使用,那么这个ua的配置规则是什么? values={"username":"15901106477","password":"wq12341234"} headers={"User-Agent":"user_agent", "Referer":"http://www.zhihu.com/"} date=urllib.urlencode (values) request=urllib2.Request(url,date,headers) response=urllib2.urlopen(request) print response.read()
referer简介cookie
简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,通常会带上Referer,告诉服务器我是从哪一个页面连接过来的,服务器 籍此能够得到一些信息用于处理。好比从我主页上连接到一个朋友那里,他的服务器就可以从HTTP Referer中统计出天天有多少用户点击我主页上的连接访问他的网站。dom
user_agent简介
字串说明:出于兼容及推广等目的,不少浏览器的标识相同,所以浏览器标识并不能说明浏览器的真实版本,真实版本信息在UA字串尾部能够找到。
加密等级标识
浏览器语言
渲染引擎
版本信息
urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个IP 的访问次数,若是访问次数过多,它会禁止你的访问。因此你能够设置一些代理服务器来帮助你作工做,每隔一段时间换一个代理。
一个免费IP示例:
#!/usr/bin/python # -*- coding: utf-8 -*- import urllib import urllib2 #构建两个代理handler,一个有代理ip,一个没有代理ip httpproxy_handler=urllib2.ProxyHandler({"http":"124.88.67.81:80"}) nullproxy_handler=urllib2.ProxyHandler({}) #定义一个代理开关 proxySwitch=True #经过urllib2.build_opener()方法使用这些代理handler对象,建立自定义opener对象 #根据代理开关是否打开,使用不一样的代理模式 if proxySwitch: opener=urllib2.build_opener(httpproxy_handler) else: opener=urllib2.build_opener(nullproxy_handler) request=urllib2.Request("http://baidu.com/") #使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理 response=opener.open(request) # 就是将opener应用到全局,以后全部的,不论是opener.open()仍是urlopen() 发送请求,都将使用自定义代理。 # urllib2.install_opener(opener) #response = urlopen(request) print response.read()
多个免费免费IP示例:
#!/usr/bin/python # -*- coding: utf-8 -*- import urllib import urllib2 import random proxy_list = [ {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"} ] #随机选择一个代理 proxy=random.choice(proxy_list) #使用选择的代理构建代理处理器对象 httpproxy_handler=urllib2.ProxyHandler(proxy) opener=urllib2.build_opener(httpproxy_handler) request=urllib2.Request("http://www.baidu.com/") response=opener.open(request) print response.read()
私密代码
上面使用的都是免费代理,不是很稳定,不少时候会出现没法使用的状况,这时候能够考虑使用私密代理。也就是向代理供应商购买代理,供应商会提供一个有效代理,而且有本身的用户名和密码,具体使用和免费代理同样,这是多了一个帐户认证,以下:
# 构建具备一个私密代理IP的Handler,其中user为帐户,passwd为密码 httpproxy_handler = urllib2.ProxyHandler({"http" : "user:passwd@124.88.67.81:80"})
上一节已经说过urlopen方法了,第三个参数就是timeout的设置,能够设置等待多久超时,为了解决一些网站实在响应过慢而形成的影响。
例以下面的代码,若是第二个参数data为空那么要特别指定是timeout是多少,写明形参,若是data已经传入,则没必要声明。
1 2 |
import urllib2 response = urllib2.urlopen('http://www.baidu.com', timeout=10) |
1 2 |
import urllib2 response = urllib2.urlopen('http://www.baidu.com',data, 10) |
#coding:utf-8 import urllib2 try: url = "http://www.baidu.com" f = urllib2.urlopen(url, timeout=0) #timeout设置超时的时间 result = f.read() print result except Exception,e: print 'a',str(e) #输出结果 a <urlopen error [Errno 115] Operation now in progress>