requests

  1. get()方法
import requests

r = requests.get('https://www.baidu.com/')
# <class 'requests.models.Response'>
print(type(r))
# 狀態(tài)碼
print(r.status_code)
# 返回的是str
print(type(r.text))
# 響應(yīng)的文本內(nèi)容
print(r.text)
# cookies的類型是RequestsCookieJar
print(r.cookies)

其他的請求,也是一句話

r = requests.post('http://httpbin.org/post')
r = requests.put('http://httpbin.org/put')
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

在請求中添加參數(shù):

import requests

data = {
    'name': 'germey',
    'age': 22
}
r = requests.get("http://httpbin.org/get", params=data)
# 網(wǎng)頁的返回類型是JOSN格式的
print(r.text)

請求的鏈接自動被構(gòu)造成了:http://httpbin.org/get?age=22&name=germey。

解析返回結(jié)果得到一個Json格式

import requests

r = requests.get("http://httpbin.org/get")
print(type(r.text))
# 將返回結(jié)果是 Json 格式的字符串轉(zhuǎn)化為字典
print(r.json())
print(type(r.json()))

抓取網(wǎng)頁

import requests
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
# 加入headers模擬瀏覽器訪問
r = requests.get("https://www.zhihu.com/explore", headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

如果抓取的是圖片信息,需要用二進(jìn)制解析:

import requests

r = requests.get("https://github.com/favicon.ico")
# 直接這樣輸出會將圖片轉(zhuǎn)為字符串,會亂碼
print(r.text)
# 輸出二進(jìn)制
print(r.content)

POST請求

模擬表單提交一樣,將一些數(shù)據(jù)提交到某個鏈接。

import requests

data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

Response

import requests

# status_code屬性得到狀態(tài)碼
r = requests.get('http://www.itdecent.cn')
print(type(r.status_code), r.status_code)
#  headers屬性得到Response Headers
print(type(r.headers), r.headers)
# cookies屬性得到cookies
print(type(r.cookies), r.cookies)
# url屬性得到URL
print(type(r.url), r.url)
# history 屬性得到請求歷史
print(type(r.history), r.history)

高級用法

文件上傳

import requests

files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)

運(yùn)行的結(jié)果:

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:application/octet-stream;base64,AAAAAA...="
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "6665", 
    "Content-Type": "multipart/form-data; boundary=809f80b1a2974132b133ade1a8e8e058", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.10.0"
  }, 
  "json": null, 
  "origin": "60.207.237.16", 
  "url": "http://httpbin.org/post"
}

文件上傳部分會單獨(dú)有一個 files 字段來標(biāo)識。

Cookies

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
    print(key + '=' + value)

我們也可以直接用 Cookies 來維持登錄狀態(tài),首先登錄知乎,將 Headers 中的 Cookies 復(fù)制下來

import requests

 headers = {
        'cookies': 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000',
        'Host': 'www.zhihu.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
    }
    r = requests.get('https://www.zhihu.com', headers=headers)
    print(r.text)

通過 cookies 參數(shù)來設(shè)置,不過這樣就需要構(gòu)造 RequestsCookieJar 對象,而且需要分割一下 Cookies ,相對繁瑣,不過效果是相同的,實(shí)例如下:

import requests

cookies = 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000'
    jar = requests.cookies.RequestsCookieJar()
    headers = {
        'Host': 'www.zhihu.com',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0;WOW 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    # ,然后將復(fù)制下來的 Cookies 利用 split() 方法分割
    for cookie in cookies.split(';'):
        key, value = cookie.split('=', 1)
        # 設(shè)置好每一個 Cookie 的 key 和 value
        jar.set(key, value)

    r = requests.get('http://www.zhihu.com', cookies=jar, headers = headers)
    print(r.text)

會話維持

利用 Session 我們可以做到模擬同一個會話,而且不用擔(dān)心 Cookies 的問題

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

代理設(shè)置

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('https://www.taobao.com', proxies=proxies)

代理需要使用 HTTP Basic Auth

import requests

proxies = {
    'https': 'http://user:password@10.10.1.10:3128/',
}
requests.get('https://www.taobao.com', proxies=proxies)

使用 SOCKS 協(xié)議代理,使用類似 http://user:password@host:port 這樣的語法來設(shè)置代理。

import requests

proxies = {
    'http': 'socks5://user:password@host:port',
    'https': 'socks5://user:password@host:port'
}
requests.get('https://www.taobao.com', proxies=proxies)

超時設(shè)置

請求分為兩個階段,即 connect(連接)和 read(讀?。?。

# 設(shè)置 timeout 值將會用作 connect 和 read 二者的 timeout 總和
r = requests.get('https://www.taobao.com', timeout=1)
# 分別指定
r = requests.get('https://www.taobao.com', timeout=(5, 11))

身份認(rèn)證

遇到必須要認(rèn)證的網(wǎng)站驗(yàn)證,可以使用 Requests 自帶的身份認(rèn)證功能。

import requests
from requests.auth import HTTPBasicAuth
# 傳HTTPBasicAuth類
r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
# 直接傳一個元組,它會默認(rèn)使用 HTTPBasicAuth 這個類來認(rèn)證
r = requests.get('http://localhost:5000', auth=('username', 'password'))
print(r.status_code)

使用 OAuth1 認(rèn)證的方法:

import requests
from requests_oauthlib import OAuth1

url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
              'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url, auth=auth)

Prepared Request

Request 的各個參數(shù)都可以通過一個 Request 對象來表示

from requests import Request, Session

url = 'http://httpbin.org/post'
data = {
    'name': 'germey'
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)

有了 Request 這個對象,我們就可以將一個個請求當(dāng)做一個獨(dú)立的對象來看待,這樣在進(jìn)行隊列調(diào)度的時候會非常方便,后面我們會有一節(jié)使用它來構(gòu)造一個 Request 隊列。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上一篇:8.Urllib庫基本使用下一篇:10.正則表達(dá)式基礎(chǔ) requests是python實(shí)現(xiàn)的最簡單易用的H...
    在努力中閱讀 3,603評論 2 11
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,430評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • urllib and urllib2 區(qū)別 –博主提示:下面的是python2中的用法,python3需要做出相應(yīng)...
    sunnyRube閱讀 1,489評論 0 1
  • 游戲找朋友(復(fù)習(xí)聲母與復(fù)韻母相拼) 前鼻韻母an 感受an的發(fā)音 四個聲調(diào)指讀說一句話 游戲:它怎么讀? 游戲:我...
    園丁的園閱讀 730評論 0 0

友情鏈接更多精彩內(nèi)容