Python 爬蟲 -- 使用 Requests 獲取網頁
requests 包用於獲取網站的內容,使用 HTTP 協議,基於 urllib3 實現。其官方中文文檔爲:Requests: HTTP for Humans
requests 的基本使用方法很簡單,這裏記錄一些最常用的方法,完整的介紹見其官方文檔,以下介紹基於 Python 3.5。
使用 requests 首先需要導入它:
import requests
發送請求
最基本的方法是 GET 請求:
url = 'http://www.zju.edu.cn/'
r = requests.get(url)
返回的 r 是一個Response
類對象,包含所有返回數據,可以從這個 Response 中提取所需的信息。
除了get()
外,常用的請求還有post()
,用法完全相同。除此之外 requests 也支持其它各種請求方法,具體參見其文檔說明。
可通過r.url()
獲取請求的 URL。
讀取響應內容
使用 Response 的 text 屬性即可:
r = requests.get(url)
print(r.text)
text 屬性是針對相應內容是文本(如 HTML 等)的情況下使用,如果返回的數據是二進制數據(如圖片等),則通過 content 屬性來讀取二進制比特流:
r = requests.get(url)
f = open('file', 'wb')
f.write(r.content)
如果返回的數據是 json,requests 中自帶了一個解析器,可以直接使用 json() 函數進行解析,返回的是一個字典:
上面這個例子演示了淘寶的 IP 查詢服務。
附加查詢參數
可以構造類似 http://www.baidu.com/s?ie=utf-8&wd=Python 這樣的查詢 URL,其中附加在? 之後的部分就是查詢參數,可以手動構造這樣一個字符串,不過 requests 中提供了更優雅的解決方案,使用一個字典作爲 params 參數即可:
url = 'http://www.baidu.com/s'
payload = {'wd': 'Python', 'ie': 'utf-8'}
r = requests.get(url, params = payload)
附加表單
與附加查詢參數類似,在 POST 請求中,可以附加表單信息,這一般用於實現登錄或提交信息等,使用一個字典作爲 data 參數即可:
payload = {'username':'username', 'password':'passwd'}
r = requests.post(url, data = payload)
讀取與設置響應數據的編碼
一般情況下 requests 均能從響應頭部獲得正確的編碼,不過若頭部沒有相應信息,則需要手動設置,不然可能會出錯。使用 Response 的 encoding 屬性即可:
r = requests.get()
f.write(r.text, encoding = r.encoding)
r.encoding = 'gb2312'
r.encdoing = 'utf-8'
使用代理
使用一個字典作爲 proxies 參數即可,下面這段代碼演示了使用 ShadowSocks 作爲代理的方法:
proxies = {
'http' : 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}
r = requests.get(url, proxies=proxies)
獲取響應狀態碼
使用 Response 的 status_code 屬性即可:
r = requests.get(url)
print(r.status_code)
自定義請求頭部
傳遞一個字典作爲 headers 參數即可:
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
r = requests.get(url, headers = header)
會話
會話可以跨請求保持某些參數,它也會在同一個 Session 實例發出的所有請求之間保持 cookies。使用如下方法新建一個會話:
s = requests.Session()
會話對象 s 具有主要的 Requests API 的所有方法。會話一般用於連續發起一系列請求的時候使用,它會自動處理 cookies 的問題,十分方便。
聲明:
本文於網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯繫我們刪除或授權事宜。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/vYDqCII3MHnUKtHtJp7jgQ