Python爬蟲 - Requests模塊

Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。
Requests 允許你發送純天然,植物飼養的 HTTP/1.1 請求,無需手工勞動。你不需要手動爲 URL 添加查詢字串,也不需要對 POST 數據進行表單編碼。Keep-alive 和 HTTP 連接池的功能是 100% 自動化的,一切動力都來自於根植在 Requests 內部的 urllib3。以上內容來自Requests官網文檔

:requests庫發送請求以後,並不會執行js代碼,這需要我們自己分析目標站點然後發起新的request請求。

一、安裝Requests

pip install requests

二、六種請求方式(post和get最常見)

requests.get('you url')         # GET請求
requests.post('you url')        # POST請求
requests.put('you url')         # PUT請求
requests.delete('you url')      # DELETE請求
requests.head('you url')        # HEAD請求
requests.options('you url')     # OPTIONS請求
import requests

r = requests.get('https://www.baidu.com/')                                             # 發起get請求
# r = requests.request(method='get',url='https://www.baidu.com/')                        # 另一種寫法,和上邊效果一樣

# r = requests.post('you url',data={'key':'value'})                                      # 發起post請求(發送字典)
# r = requests.post('you url',data=json.dumps({'key':'value'}))                          # 發起post請求(發送json)
# r = requests,request(method='post',url='you url',data={'key':'value'})                 # 另一種寫法
# r = requests,request(method='post',url='you url',data=json.dumps({'key':'value'}))     # 另一種寫法

print(r) # 打印結果爲狀態碼,<Response [200]>表示請求成功

三、Requests參數詳情

1、添加headers(請求頭)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

response = requests.get("http://www.baidu.com/", headers=headers)

print(response) # 返回結果爲<Response [200]>說明請求成功

2、添加params(給url添加參數)

import requests

kw = {'wd':'python'}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)

print(response) # 返回結果爲<Response [200]>說明請求成功

3、添加proxies(代理)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

# {'類型':'ip:端口'}
proxies = {
    'http':'106.110.212.206:9999'
}
# 如果代理需要使用HTTP Basic Auth,可以使用下面這種格式:
#proxy = { "http": "mr_mao_hacker:[email protected]:9999" }

response = requests.get("http://www.baidu.com/", headers=headers, proxies = proxies)

print(response) # 返回結果爲<Response [200]>說明請求成功

代理IP可以在免費的網站上獲取:西刺代理,大家都懂,免費的質量上不是很樂觀,測試還是沒問題的,可以多試幾個。

4、添加data(post請求)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
data = {
    "key":"value"
}

response = requests.post("you url", data = data, headers = headers)
print(response)

5、添加auth(Web客戶端驗證)

import requests

auth = ('test', '123456')

response = requests.get('you url', auth=auth)

print(response) # 返回結果爲<Response [200]>說明請求成功

6、設置超時時間

import requests

response = requests.get('url',timeout=10)    #設置秒數超時,僅對於連接有效

7、添加verify(跳過證書驗證)

例如這樣的頁面就可以使用verify
程序會報錯:SSLError: (“bad handshake: Error([(‘SSL routines’, ‘ssl3_get_server_certificate’, ‘certificate verify failed’)],)”,)
在這裏插入圖片描述

import requests

response = requests.get("https://www.12306.cn/mormhweb/", verify = False)

print(response) # 返回結果爲<Response [200]>說明請求成功

四、獲取響應的內容

response.encoding              # 獲取當前的編碼
response.encoding = 'utf-8'    # 設置編碼
response.text                  # 以encoding解析返回內容。字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼。
response.content               # 以字節形式(二進制)返回。字節方式的響應體,會自動爲你解碼 gzip 和 deflate 壓縮。

response.headers               # 以字典對象存儲服務器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None

response.status_code           # 響應狀態碼
response.raw                   # 返回原始響應體,也就是 urllib 的 response 對象,使用 r.raw.read()   
response.ok                    # 查看r.ok的布爾值便可以知道是否登陸成功
 #*特殊方法*#
response.json()                # Requests中內置的JSON解碼器,以json形式返回,前提返回的內容確保是json格式的,不然解析出錯會拋異常
response.raise_for_status()    # 失敗請求(非200響應)拋出異常
response.cookies               # 返回cookie
response.history               # 返回重定向信息,當然可以在請求是加上allow_redirects = false 阻止重定向
import requests

response = requests.get('https://www.baidu.com/')   # 發起get請求
print('當前的編碼:',r.encoding)
response.encoding = 'utf-8'   #設置編碼
print('設置後的編碼:',response.encoding)
print('以encoding解析返回內容:',response.text)
print('以字節形式(二進制)返回:',response.content)
print('響應頭:',response.headers)
print('響應狀態碼:',response.status_code)
print('返回原始響應體:',response.raw)
print('是否登陸成功:',response.ok)

# print('以json形式返回:',response.json()) #確保返回的內容是json格式的,不然解析出錯會拋異常
print('失敗請求拋出異常:',response.raise_for_status())
print('結果爲狀態碼',response)
print('cookie:',response.cookies)
print('重定向信息:',response.history)
# 運行結果
當前的編碼: ISO-8859-1
設置後的編碼: utf-8
以encoding解析返回內容: <!DOCTYPE html><!--STATUS OK--><html> <head>...太多了,略一部分
以字節形式(二進制)返回: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head>...太多了,略一部分
響應頭: {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 09 Jan 2020 03:31:29 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
響應狀態碼: 200
返回原始響應體: <urllib3.response.HTTPResponse object at 0x000001A9337809B0>
是否登陸成功: True
失敗請求拋出異常: None
結果爲狀態碼 <Response [200]>
cookie: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
重定向信息: []

五、定製cookie信息

import requests

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'}
cookie = {'key':'value'}
response = requests.get('your url',headers=header,cookies=cookie) 

六、操作Sission實現人人網登錄

import requests

# 1. 創建session對象,可以保存Cookie值
ssion = requests.session()

# 2. 處理 headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}

# 3. 需要登錄的用戶名和密碼
data = {"email": "用戶名", "password": "密碼"}

# 4. 發送附帶用戶名和密碼的請求,並獲取登錄後的Cookie值,保存在ssion裏
ssion.post("http://www.renren.com/PLogin.do", data=data)

# 5. ssion包含用戶登錄後的Cookie值,可以直接訪問那些登錄後纔可以訪問的頁面
response = ssion.get("http://www.renren.com/410043129/profile")

# 6. 打印響應內容
print(response.text)

七、會話對象,能夠跨請求保持某些參數

import requests

s = requests.Session()
s.auth = ('user','pwd')
s.headers = {'key':'value'}
r = s.get('you url1')
r1 = s.get('you url2') 
歡迎關注同名微信公衆號:程序猿雜記

程序猿雜記

技術|交流|福利
發佈了63 篇原創文章 · 獲贊 124 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章