Python可以說是爬網的利器,本文主要介紹了一些python來模擬http請求的一些方法和技巧。 Python處理請求的類庫有兩個,urllib,urllib2。 這兩個類庫並不是一個類庫的兩個不同版本,urllib主要用來處理一些url相關的內容,發送請求的時候,請求對象只能是一個url。url
Python可以說是爬網的利器,本文主要介紹了一些python來模擬http請求的一些方法和技巧。
Python處理請求的類庫有兩個,urllib,urllib2。 這兩個類庫並不是一個類庫的兩個不同版本,urllib主要用來處理一些url相關的內容,發送請求的時候,請求對象只能是一個url。urllib2可以用request對象來實現請求,這樣就可以實現如偽造頭部,設置代理,http get,http post等方法。
閱讀本文需要瞭解http請求的一些基本知識,如:
- 什麼是httpwebrequest,httpwebresponse
- 什麼是get,post
- 什麼是cookie
本文主要介紹模擬請求用到的這些方式:
- 設置代理
- 偽造頭部或者Header信息
- 啟用cookie
- url參數的處理
使用urllib2.urlopen直接發送
import urllib2 url = 'http://www.baidu.com/' response = urllib2.urlopen(url) ##urlopen接受傳入參數是string或者是request response_text = response.read()
使用urllib.build_opener
直接發送請求
import urllib2 url = 'http://www.baidu.com/' opener = urllib2.build_opener() response = opener.open(url) response_text = response.read()
通過代理訪問站點
proxy_handler = urllib2.ProxyHandler({"http" : 'http://localhost:8888'}) opener = urllib2.build_opener(proxy_handler) response = opener.open(url) response_text = response.read()
請求中附帶request body(http post)
opener = urllib2.build_opener() response = opener.open(url,'request body') response_text = response.read()
body中如果是key-value形式的,可以參照下麵的url處理部分來處理
啟用Cookie
cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response = opener.open(url) response_text = response.read()
使用urllib2.Request
請求中添加自定義的Header信息
request = urllib2.Request(url) request.add_data('1234567') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request)
處理url中的參數信息
無論是使用get方式還是post方式,經常會遇到需要使用參數的形式,處理參數可以使用下麵的類庫
參數集合轉string
para = {'111':'222','aaa':'bbb'} encodeurl = urllib.urlencode(para)
輸出aaa=bbb&111=222
url參數轉dictionary
url = 'https://www.baidu.com/s?wd=python%20url%20querystring&pn=10&oq=python%20url%20querystring&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_idx=2&rsv_pq=d09af93600035cb8&rsv_t=d151qRmNNdybGINHcKbyO360E2%2Fg%2FUs2t0MiKqRQXwhHZuNF3IlKyyStzYuofVZczQA3' splitresult_instance = urlparse.urlsplit(url)
輸出對象:
SplitResult(scheme='https', netloc='www.baidu.com', path='/s', query='wd=python%20url%20querystring&pn=10&oq=python%20url%20querystring&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_idx=2&rsv_pq=d09af93600035cb8&rsv_t=d151qRmNNdybGINHcKbyO360E2%2Fg%2FUs2t0MiKqRQXwhHZuNF3IlKyyStzYuofVZczQA3', fragment='')
想轉成集合只要
result_dic=urlparse.parse_qs(splitresult.query)
通過這種處理方式,把data信息放在url上來實現http get,放在body中實現http post。
此文同時托管在了 http://simmon.club/blog/Python-HttpRequest/ 上