python基礎知識整理——urllib2的高級使用

應對反爬的方法:
cookies池,更換cookie意味着更換用戶
proxies池,更換proxy意味着更換IP
header中假裝瀏覽器,加入User-Agent及Referer (這兩種是今天學習的)
設置延遲,time.sleep(1)php

1.headers頭域設置

有些網站不會贊成程序直接用上面的方式進行訪問,若是識別有問題,那麼站點根本不會響應,因此爲了徹底模擬瀏覽器的工做,咱們須要設置一些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簡介

  • UserAgent中文名爲用戶代理,是Http協議中的一部分,屬於頭域的組成部分,UserAgent也簡稱UA。
  • 它是一個特殊字符串頭,是一種向訪問網站提供你所使用的瀏覽器類型及版本、操做系統及版本、瀏覽器內核、等信息的標識。
  • 經過這個標識,用戶所訪問的網站能夠顯示不一樣的排版從而爲用戶提供更好的體驗或者進行信息統計,UA能夠進行假裝。
  • 瀏覽器的UA字串的標準格式:瀏覽器標識(操做系統標識;加密等級標識;瀏覽器語言)渲染引擎標識版本信息。但各個瀏覽器有所不一樣。

字串說明:出於兼容及推廣等目的,不少瀏覽器的標識相同,所以瀏覽器標識並不能說明瀏覽器的真實版本,真實版本信息在UA字串尾部能夠找到。

加密等級標識

  • N:表示無安全加密
  • I:表示弱安全加密
  • U:表示強安全加密


瀏覽器語言

  • 在首選項>常規>語言中指定的語言


渲染引擎

  • 顯示瀏覽器使用的主流渲染引擎有:Gecko、WebKit、KHTML、Presto、Trident、Tasman等
  • 格式爲:渲染引擎/版本信息


版本信息

  • 顯示瀏覽器的真實版本信息
  • 格式爲:瀏覽器/版本信息

2.proxy代理設置

 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"})

 

3.timeout設置

上一節已經說過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>
相關文章
相關標籤/搜索