urllib,urllib2的使用

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()  # 讀取頁面內容
相關文章
相關標籤/搜索