1. 程式人生 > 實用技巧 >初識爬蟲之requests庫使用篇!入門必學篇!

初識爬蟲之requests庫使用篇!入門必學篇!

之前我們瞭解過了urllib的庫的使用方法,但是我們發現在實際的運用過程中,我們使用requests更加的頻繁一些。它可以解決之前的一些繁瑣的語法,強大的地方我們就開始看看吧!

import requests
r=requests.get("https://www.baidu.com/")
# print(type(r))#型別
print(r.status_code)#狀態碼
# print(type(r.text))#響應體型別
# print(r.text)#內容
print(r.cookies)#cookies

它的方便之處不僅僅在於這裡,它還可以用一句話來設定自己請求方法,例如我們用:requests.post(put)(delete)(head)(options)這些是不是比urllib簡單的多。

get請求

r=requests.get("https://www.baidu.com")
print(r.text)

返回了它的頁面程式碼

data={
    "name":"bob",
     "age":18
}
r=requests.get("http://httpbin.org/get",params=data)
print(r.text)

這個就是給它額外新增資訊,注意箭頭的地方,已經識別為爬蟲-Python了。

data={
    "name":"bob",
     "age":18
}
r=requests.get("http://httpbin.org/get",params=data)
print(r.text)
print(r.json())


可以發現,呼叫 json ()方法,就可以將返回結果是 JSON 格式的字串轉化為字典。

比如我們看看這個例項

我們請求普通的網頁,來獲取資訊

抓取二進位制資料
平時我們爬蟲肯定要下載圖片,音樂,視訊,還有一些東西,這個時候我們就需要用到二進位制抓取了。圖片、音訊、視訊這些檔案本質上都是由二進位制碼組成的,由於有特定的儲存格式和對應的解析方式, 我們才可以看到這些形形色色的多媒體 。

r=requests.get("https://httpbin.org/get?")
print(r.text)
print(r.content)#二進位制型別,一般用於圖片的轉化寫入

顧名思義前面列印的肯定是亂碼,但是後面輸出的也不是一個圖片,它只是以二進位制的型別輸出的,雖然看不見,但是我們可以儲存之後看見。

r=requests.get("https://img3.doubanio.com/view/photo/l/public/p480747492.webp")
# print(r.text)     #亂碼
with open("E:\Python實驗位置\圖片\圖片3\pavico.jpg","wb") as f:
    f.write(r.content)
    print("儲存成功!")

這樣你就可以去你的檔案目錄裡面看看這些東西是否已經抓取成功了。

這裡簡單介紹一下這個東西

python 中os模組os.path.exists()含義,os.path模組主要用於檔案的屬性獲取,exists是“存在”的意思,所以顧名思義,os.path.exists()就是判斷括號裡的檔案是否存在的意思,括號內的可以是檔案路徑。

import os
path = os.path.exists('user.py')
print(path)
123
True
 
Process finished with exit code 0

不存在false,存在true

POST請求

和get請求差不多一樣的,將get換為POST即可,例如我們可以列印一些屬性值


其他

這裡分別列印輸出 status_code 屬性得到狀態碼,輸出 headers 屬性得到響應頭,輸出headers屬性,得到 Cookies ,輸出 url 屬性得到 URL ,輸出 history 屬性得到請求歷史。

狀態碼有Python內建的狀態碼,我們可以互相比較來獲得正常的響應

import requests
r = requests.get("https://www.baidu.com")
exit() if not r.status_code == requests.codes.ok else print("請求成功")
123
exit() if not r.status_code == requests.codes.ok else print("請求成功")
1

這個經常用到的,保障程式正常執行

高階語法

檔案上傳:

import requests
files={"file":open("檔名","rb")}
r=requests.post("url",files=files)
print(r.text)

12345

裡面的東西需要自己去新增,注意這個時候的檔案的路徑必須和該程式是一樣的,在同一目錄。

cookies:

首先我們要把自己的網站裡面的cookies找到,之後再去複製貼上在我們程式裡面,這個也是我們經常在進行爬蟲需要做的一個工作之一。它的功能就是維持我們使用者的 登陸狀態,通常我們加入headers裡面,比如我看看這個例項


爬取一些高階的網站,知乎

也可以自己獲取

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

123456

session物件

在 requests 中,如果直接利用 get ()或 post ()等方法的確可以做到模擬網頁的請求,但是這實際上是相當於不同的會話,也就是說相當於你用了兩個瀏覽器打開了不同的頁面。其實解決這個問題的主要方法就是維持同一個會話 , 也就是相當於開啟一個新的瀏覽器選項卡而不是新開一個瀏覽器 。

import requests

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


SSL證書

requests 還提供了證書驗證的功能 。當傳送 HTTP 請求的時候,它會檢查 SSL 證書,我們可以使用 verify 引數控制是否檢查此證書 。 其實如果不加 verify 引數的話,預設是 True ,會自動驗證。

通常變為false之後,他還是會彈出警告
這裡我們遮蔽警告


前方高能
代理設定

對於某些網站,在測試的時候請求幾次 , 能正常獲取內容。 但是一旦開始大規模爬取,對於大規模且頻繁的請求,網站可能會彈出驗證碼,或者跳轉到登入認證頁面 , 更甚者可能會直接封禁客戶端的 IP ,導致一定時間段內無法訪問 。在爬取一些淘寶,京東這些反爬技術較強的網站,代理的技術不可或缺。

import requests
proxies={
    "http":"http://165.225.32.55",
    "https":"http://165.225.110.67",

}
requests.get("ulr",proxies=proxies)
1234567

超時

timeout=num或者timeout=(1,2,6)#連線讀取和最小響應

身份驗證


如果使用者名稱和密碼正確的話,請求時就會自動認證成功,會返回 200 狀態碼 ;如果認證失敗, 則返回 401 狀態碼。
優化:


資料結構
之前在urllib裡面有request.Request這個用法,在這裡我們也可以這樣用
requests.Request()

from requests import Request,Session
url = "http://httpbin.org/post "
data={

}
headers={

}
s=Session()
req=Request("POST",url=url,data=data,headers=headers)
pre=s.prepare_request(req)
r=s.send(pre)
print(r.text)
12345678910111213

爬蟲正則表示式也是基礎,雖然Xpath比較強,但是我們還是要了解這個東西

你學會餓了了嗎n