在 HTTP Request 中加入特定的 Header


在 HTTP Request 中加入特定的 Header

要加入 header,需要使用 Request 對象:

#code1
import urllib2
request = urllib2.Request('http://www.baidu.com/')
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)
print response.read()

對有些 header 要特別留意,服務器會針對這些 header 做檢查
User-Agent : 有些服務器或 Proxy 會通過該值來判斷是否是瀏覽器發出的請求
Content-Type : 在使用 REST 接口時,服務器會檢查該值,用來確定 HTTP Body 中的內容該怎樣解析。常見的取值有:
application/xml : 在 XML RPC,如 RESTful/SOAP 調用時使用
application/json : 在 JSON RPC 調用時使用
application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時使用
在使用服務器提供的 RESTful 或 SOAP 服務時, Content-Type 設置錯誤會導致服務器拒絕服務
再給一個詳細的:

#Code2
import urllib,urllib2

url = 'http://www.super-ping.com/ping.php?node='+node+'&ping=www.google.com'
        headers = { 'Host':'www.super-ping.com',
                    'Connection':'keep-alive',
                    'Cache-Control':'max-age=0',
                    'Accept': 'text/html, */*; q=0.01',
                    'X-Requested-With': 'XMLHttpRequest',
                    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',
                    'DNT':'1',
                    'Referer': 'http://www.super-ping.com/?ping=www.google.com&locale=sc',
                    'Accept-Encoding': 'gzip, deflate, sdch',
                    'Accept-Language': 'zh-CN,zh;q=0.8,ja;q=0.6'
                    }
        data = None
        req = urllib2.Request(url, data, headers)
        response = urllib2.urlopen(req)
        compressedData = response.read()

某些網站反感爬蟲的到訪,於是對爬蟲一律拒絕請求
這時候我們需要偽裝成瀏覽器,這可以通過修改http包中的header來實現。
上面的例子里面user-agent就是偽裝過的。

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',

對付”反盜鏈”

某些站點有所謂的反盜鏈設置,其實說穿了很簡單,
就是檢查你發送請求的header里面,referer站點是不是他自己,
所以我們只需要像把headers的referer改成該網站即可,以cnbeta為例:

#Code3
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}

headers是一個dict數據結構,你可以放入任何想要的header,來做一些偽裝。
例如,有些網站喜歡讀取header中的X-Forwarded-For來看看人家的真實IP,可以直接把X-Forwarde-For改了。

解壓縮

在Code2中最后獲取的數據是gzip壓縮過的(在這個樣例中返回的數據是服務器決定的),可以寫進文件查看,對其進行解壓縮:

#Code4
import gzip,StringIO

compressedData = response.read()
        compressedStream=StringIO.StringIO(compressedData)
        gzipper=gzip.GzipFile(fileobj=compressedStream)
        data=gzipper.read()

Reference:

http://blog.csdn.net/pleasecallmewhy/article/details/8925978


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM