應對反爬的方法:
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>