1.簡單爬取一個頁面html
import urllib f = urllib.urlopen('http://www.qq.com') # HTTP協議,也能夠是FTP,FILE,HTTPS等 print f.read() # 讀取整個頁面
2.經過構造Request請求對象json
import urllib2 req = urllib2.Request('http://www.qq.com') # 構造一個Request請求對象 f = urllib2.urlopen(req) # 傳入一個Request請求對象 print f.read().decode('gbk') # 讀取整個頁面,read()返回的是字節對象,轉爲gbk編碼顯示中文
3.POST和GET數據傳送瀏覽器
import urllib # POST data = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) # 數據字典 print data # eggs=2&bacon=0&spam=1 f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query', data) # POST,若是data裏有中文,要data.encode('utf-8') print f.geturl() # 獲取url,http://www.musi-cal.com/cgi-bin/query print f.read(100) # 返回的是字節對象,讀取前100個字節 # GET f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query?%s' % data) # GET,若是data裏有中文,要data.encode('utf-8') print f.geturl() # 獲取url,http://www.musi-cal.com/cgi-bin/query?eggs=2&bacon=0&spam=1 print f.read(100) # 返回的是字節對象,讀取前100個字節
4.設置Headers服務器
import urllib2 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0'} # 設置User-Agent req = urllib2.Request(url='https://www.qq.com', headers=headers) # 構造一個Request請求對象,並傳入Headers f = urllib2.urlopen(req) # 傳入一個Request請求對象 print f.read().decode('gbk') # 讀取整個頁面,read()返回的是字節對象,轉爲gbk編碼顯示中文 req = urllib2.Request(url='https://www.qq.com') # 構造一個Request請求對象 req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0') # 添加User-Agent到Headers f = urllib2.urlopen(req) # 傳入一個Request請求對象 print f.read().decode('gbk') # 讀取整個頁面,read()返回的是字節對象,轉爲gbk編碼顯示中文
Header的一些屬性說明:cookie
User-Agent:經過該值來判斷是否爲瀏覽器發出的請求。網絡
Content-Type:使用REST接口時,服務器會檢查此值來肯定Body中的內容要怎樣解析。app
application/xml:在XML RPC調用時使用。post
application/json:在JSON RPC調用時使用。ui
application/x-www-form-urlencoded:瀏覽器提交Web表單時使用。編碼
5.代理(Proxy)設置
import urllib2 proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'}) # 代理處理器 proxy_auth_handler = urllib2.ProxyBasicAuthHandler() # 代理驗證處理器 proxy_auth_handler.add_password('realm', 'host', 'username', 'password') # 添加用戶名和密碼 opener = urllib2.build_opener(proxy_handler, proxy_auth_handler) # 創建一個opener,傳入了代理處理器和代理驗證處理器 f = opener.open('http://www.example.com/login.html') # 用創建的opener直接打開網頁,不須要調用urllib2.install_opener() # 或者這樣使用 # urllib2.install_opener(opener) # 安裝opener # f = urllib2.urlopen('http://www.example.com/login.html') # 調用urlopen() print f.read() # 得到頁面內容
6.超時(timeout)設置
# 參考5中的代碼 f = opener.open('http://www.example.com/login.html', timeout=5) # 超時5秒則拋出URLError異常
7.異常處理(URLError,HTTPError)
URLError是IOError的子類,HTTPError是URLError的子類。URLError產生的緣由有:網絡無鏈接,鏈接不到服務器,服務器不存在,請求超時等。URLError異常有reason
屬性,說明了異常的緣由。
import urllib2 req = urllib2.Request(url='http://www.baidu123456123456123456.com') # 一個不存在的網頁 try: f = urllib2.urlopen(req) # 試圖打開不存在的網頁 print f.read() except urllib2.URLError as e: # 拋出異常 print e.reason # [Errno 11001] getaddrinfo failed else: print u'成功'
import urllib2 req = urllib2.Request(url='https://www.douyu.com/Json.html') # 一個不存在的網頁 try: f = urllib2.urlopen(req) # 試圖打開不存在的網頁 print f.read() except urllib2.HTTPError as e: print e.reason # Not Found print e.code # 404 except urllib2.URLError as e: # 拋出異常 print e.reason else: print u'成功'
HTTPError異常除了繼承了reason
屬性,還有code
屬性,是異常對應的狀態碼。HTTP狀態碼有:
100:客戶端繼續發送請求的剩餘部分,如請求已完成,忽略。 101:發送完此響應的最後空行,服務器切換到Upgrade消息頭中定義的協議。 102:處理被繼續執行。 200:請求成功。 201:請求完成。 202:請求被接受,處理還沒有完成。 204:服務器已實現請求,但沒有返回信息。 300:存在多個可用的被請求資源。 301:請求到的資源會分配一個永久的URL,未來經過此URL來訪問。 302:請求到的資源在一個不一樣的URL臨時保存。 304:請求的資源未更新。 400:非法請求。 401:未受權。 403:禁止。 404:找不到。 500:服務器內部錯誤。 501:服務器沒法識別。 502:錯誤網關。 503:服務出錯。
8.Cookie的使用(cookielib.CookieJar,cookielib.FileCookieJar,cookielib.MozillaCookieJar,cookielib.LWPCookieJar)
cookielib.MozillaCookieJar和cookielib.LWPCookieJar是cookielib.FileCookieJar的子類,cookielib.FileCookieJar是cookielib.CookieJar的子類。
# cookie保存在變量中 import urllib2 import cookielib cj = cookielib.CookieJar() # CookieJar對象,cookie會保存在這個變量中 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 傳入cookie處理器來構建opener f = opener.open('http://www.baidu.com') # 打開頁面 for item in cj: # 歷遍cookie中的鍵值對 print u'鍵:' + item.name print u'值:' + item.value
# cookie保存到文件 import urllib2 import cookielib filename = 'cookie.txt' cj = cookielib.MozillaCookieJar(filename) # MozillaCookieJar對象,cookie會保存在文件中 processor = urllib2.HTTPCookieProcessor(cj) # cookie處理器 opener = urllib2.build_opener(processor) # 傳入cookie處理器來構建opener f = opener.open('http://www.baidu.com') # 打開頁面 cj.save(ignore_discard=True, ignore_expires=True) # 保存,cookie被丟棄也保存,cookie到期也保存
# 讀取cookie import urllib2 import cookielib cj = cookielib.MozillaCookieJar() # MozillaCookieJar對象 cj.load('cookie.txt', ignore_discard=True, ignore_expires=True) # 讀取cookie文件 processor = urllib2.HTTPCookieProcessor(cj) # cookie處理器 req = urllib2.Request('http://www.baidu.com') # 創建請求 opener = urllib2.build_opener(processor) # 傳入cookie處理器來構建opener f = opener.open(req) # 打開頁面 print f.read() # 讀取頁面內容
# 模擬登錄的過程 import urllib import urllib2 import cookielib filename = 'cookie.txt' cj = cookielib.MozillaCookieJar(filename) # MozillaCookieJar對象,cookie會保存在文件中 processor = urllib2.HTTPCookieProcessor(cj) # cookie處理器 opener = urllib2.build_opener(processor) # 傳入cookie處理器來構建opener data = {} # 數據字典 data['username'] = 'xxxxxxx' # 用記名 data['password'] = '1111111' # 密碼 post = urllib.urlencode(data) # 生成用於傳遞的數據字符串 url = 'http://www.xxxx.com/login' # 登錄頁面 req = urllib2.Request(url=url, data=post) # 創建請求,傳入登錄須要的數據,如用戶名密碼之類 f = opener.open(req) # 打開頁面 cj.save(ignore_discard=True, ignore_expires=True) # 保存,cookie被丟棄也保存,cookie到期也保存 other_url = 'http://www.xxxx.com/other' # 須要登錄才能訪問的頁面 f = opener.open(other_url) # 訪問須要登錄才能訪問的頁面 print f.read() # 讀取頁面內容