Python網路請求庫Requests,媽媽再也不會擔心我的網路請求了(一)

〆 小源。發表於2019-03-04

本文同步發表於我的微信公眾號,掃一掃文章底部的二維碼或在微信搜尋 極客導航 即可關注,每個工作日都有文章更新。

一、概況

網路請求可能是每門語言比較重要的一部分了,在Python語言中,雖然有urllib這樣的自帶原生網路請求庫,但是它的一些API對待開發者好像不怎麼友好。So,Requests的革命開始了,不僅API人性化,更重要的是它支援urllib所有特性。

Requests支援HTTP連線保持和連線池,支援使用cookie保持會話,支援檔案上傳,支援自動確定響應內容的編碼,支援國際化的URLPOST資料自動編碼。好處不多說了,我們快來體驗一下吧。

好像忘記說了一句,Requests的庫再牛逼,底層也是urllib

革命

二、準備

  • 安裝requests庫
pip3 install requests
複製程式碼

###三、使用

1、Get請求:
response = requests.get("http://www.baidu.com/")
複製程式碼

看到沒,對,你沒看錯,發起GET請求就短短的一行程式碼。 返回的response有很多屬性,我們來看看:

response.text  返回解碼後的字串,
respones.content  以位元組形式(二進位制)返回。
response.status_code  響應狀態碼
response.request.headers  請求的請求頭
response.headers  響應頭
response.encoding = 'utf-8'   可以設定編碼型別
response.encoding   獲取當前的編碼
response.json()  內建的JSON解碼器,以json形式返回,前提返回的內容確保是json格式的,不然解析出錯會拋異常
複製程式碼
  • 新增引數和請求頭
import requests

#引數
kw = {'wd':'美女'}

#請求頭
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
}

# params 接收一個字典或者字串的查詢引數,
# 字典型別自動轉換為url編碼,不需要urlencode()
response = requests.get(
    "http://www.baidu.com/s?",
    params = kw, 
    headers = headers
)

# 檢視響應內容,response.text 返回的是Unicode格式的資料
print (response.text)

# 檢視響應內容,response.content返回的位元組流資料
print (respones.content)

# 檢視完整url地址
print (response.url)

# 檢視響應頭部字元編碼
print (response.encoding)

# 檢視響應碼
print (response.status_code)
複製程式碼

返回的內容如下:

......內容太多,不宜展示

......內容太多,不宜展示

'http://www.baidu.com/s?wd=%E9%95%BF%E5%9F%8E'

'utf-8'

200
複製程式碼

注意

  • 使用response.text時,Requests會基於 HTTP 響應的文字編碼自動解碼響應內容,大多數 Unicode 字符集都能被無縫地解碼。
  • 使用response.content時,返回的是伺服器響應資料的原始二進位制位元組流,可以用來儲存圖片等二進位制檔案。

比如:

import  requests
response = requests.get("http://www.sina.com")
print(response.request.headers)
print(response.content.decode('utf-8'))
複製程式碼

結果:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>新浪首頁</title>
    <meta name="keywords" content="新浪,新浪網,SINA,sina,sina.com.cn,新浪首頁,門戶,資訊" />
    ...
複製程式碼

如果用response.text可能會出現亂碼情況,比如:

import requests
response = requests.get("http://www.sina.com")
print(response.text)
複製程式碼

結果:

<!DOCTYPE html>
<!-- [ published at 2017-06-09 15:18:10 ] -->
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>新浪首页</title>
    <meta name="keywords" content="新浪,新浪网,SINA,sina,sina.com.cn,新浪首页,门户,资讯" />
    <meta name="description" content="新浪网为全çƒç”¨æˆ·24å°æ—¶æ供全é¢åŠæ—¶çš„中文资讯,内容覆盖国内外çªå‘新闻事件ã€ä½“å›èµ›äº‹ã€å¨±ä¹æ—¶å°šã€äº§ä¸šèµ„讯ã€å®žç”¨ä¿¡æ¯ç­‰ï¼Œè®¾æœ‰æ–°é—»ã€ä½“育ã€å¨±ä¹ã€è´¢ç»ã€ç§‘技ã€æˆ¿äº§ã€æ±½è½¦ç­‰30多个内容频é“,åŒæ—¶å¼€è®¾åšå®¢ã€è§†é¢‘ã€è®ºå›ç­‰è‡ªç”±äº’动交æµç©ºé—´ã€‚" />
    <link rel="mask-icon" sizes="any" href="//www.sina.com.cn/favicon.svg" color="red">
複製程式碼
  • 原因

當收到一個響應時,Requests會猜測響應的編碼方式,用於在你呼叫response.text方法時對響應進行解碼。Requests首先在 HTTP 頭部檢測是否存在指定的編碼方式,如果不存在,則會使用 chardet.detect來嘗試猜測編碼方式(存在誤差),所以更推薦 response.content.deocde()

2、Post請求:

網站登入和註冊等功能一般都是通過post請求方式做的,學會用Requests發起post請求也是爬取需要登入網站的第一步。

import requests

#測試請求地址
req_url = "https://httpbin.org/post"

#表單資料
formdata = {
    'username': 'test',
    'password': '123456',
}

#新增請求頭
req_header = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
#發起請求
response = requests.post(
    req_url, 
    data = formdata, 
    headers = req_header
)

print (response.text)
# 如果是json檔案可以直接顯示
#print (response.json())
複製程式碼

結果:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "password": "123456",
    "username": "test"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "29",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
  },
  "json": null,
  "origin": "223.72.76.90, 223.72.76.90",
  "url": "https://httpbin.org/post"
}
複製程式碼
  • 上傳檔案
url = 'https://httpbin.org/post'
files = {'file': open('image.png', 'rb')}
response = requests.post(url, files=files)
print(response.text)
複製程式碼

結果:

{
  "args": {},
  "data": "",
  "files": {
    "file": "....內容太多,不宜展示"
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "27597",
    "Content-Type": "multipart/form-data; boundary=16afeeccbaec949570677ca271dc2d0c",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.21.0"
  },
  "json": null,
  "origin": "223.72.76.90, 223.72.76.90",
  "url": "https://httpbin.org/post"
}
複製程式碼

四、總結

以上是Requests最基本的Get請求和Post請求,語法比較簡單,這也是學會爬蟲的第一步。加油吧!騷年。

歡迎關注我的公眾號,我們一起學習。

歡迎關注我的公眾號

相關文章