人生苦短,我用 Pythonhtml
前文傳送門:python
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝github
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門數據庫
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門json
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎cookie
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝app
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
在前面的前置準備中,咱們安裝了好多第三方的請求庫,如 Request 、 AioHttp 等,不知各位同窗還有印象不,沒印象的同窗能夠翻翻前面的文章。
前面幾篇文章咱們大體瞭解了 urllib 的基本用法,其中確實有不少使用不便的地方,如處理 Cookies 或者使用代理訪問的時候,都須要使用 Opener 和 Handler 來處理。
這時,更增強大的 Request 庫的出現就瓜熟蒂落。有了 Request 庫,咱們能夠更加簡單方便的使用這些高階操做。
首先仍是各類官方地址敬上:
這裏列出各類官方文檔的目的是但願各位同窗能養成查閱官方文檔的習慣,畢竟小編也是人,也會犯錯,相比較而言,官方文檔的錯誤率會很是低,包括有時候一些疑難問題都能經過官方文檔來解決。
各類基礎概念咱們已經在介紹 urllib 基礎使用的時候都介紹過了,這裏也就再也不多 BB ,直接進入乾貨環節:寫代碼 。
這裏咱們使用的測試地址依然事前面提到過的:https://httpbin.org/ 。
GET 請求是咱們最經常使用的請求,先來了解一下如何使用 Requests 發送一個 GET 請求。代碼以下:
import requests
r = requests.get('https://httpbin.org/get')
print(r.text)複製代碼
結果以下:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "116.234.254.11, 116.234.254.11",
"url": "https://httpbin.org/get"
}複製代碼
這裏就很少講了,和前面的 urllib 是同樣的。
若是咱們想在 GET 請求中添加請求參數,須要如何添加呢?
import requests
params = {
'name': 'geekdigging',
'age': '18'
}
r1 = requests.get('https://httpbin.org/get', params)
print(r1.text)複製代碼
結果以下:
{
"args": {
"age": "18",
"name": "geekdigging"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "116.234.254.11, 116.234.254.11",
"url": "https://httpbin.org/get?name=geekdigging&age=18"
}複製代碼
能夠看到,請求的連接被自動構形成了:https://httpbin.org/get?name=geekdigging&age=18 。
值得注意的一點是, r1.text
返回的數據類型是 str 類型,可是其實是一個 json ,若是想直接將這個 json 轉化成咱們能夠直接使用的字典格式,可使用如下方法:
print(type(r1.text))
print(r1.json())
print(type(r.json()))複製代碼
結果以下:
<class 'str'>
{'args': {'age': '18', 'name': 'geekdigging'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '116.234.254.11, 116.234.254.11', 'url': 'https://httpbin.org/get?name=geekdigging&age=18'}
<class 'dict'>複製代碼
添加請求頭:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'referer': 'https://www.geekdigging.com/'
}
r2 = requests.get('https://httpbin.org/get', headers = headers)
print(r2.text)複製代碼
結果以下:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"Referer": "https://www.geekdigging.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
},
"origin": "116.234.254.11, 116.234.254.11",
"url": "https://httpbin.org/get"
}複製代碼
與 urllib.request 同樣,咱們也是經過 headers 參數來傳遞頭信息。
若是咱們想要抓取一張圖片或者一個視頻這種文件,能夠怎麼作呢?
這些文件本質上都是由二進制碼組成的,因爲有特定的保存格式和對應的解析方式,咱們才能夠看到這些形形色色的多媒體。因此,想要抓取它們,就要拿到它們的二進制碼。
好比咱們抓取一張百度上的 logo 圖片,圖片地址爲:https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png
import requests
r3 = requests.get("https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png")
with open('baidu_logo.png', 'wb') as f:
f.write(r3.content)複製代碼
結果小編就不展現了,能夠正常下載。
咱們接着來介紹一個很是經常使用的 POST 請求。和上面的 GET 請求同樣,咱們依然使用: https://httpbin.org/post 進行測試。示例代碼以下:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'referer': 'https://www.geekdigging.com/'
}
params = {
'name': 'geekdigging',
'age': '18'
}
r = requests.post('https://httpbin.org/post', data = params, headers = headers)
print(r.text)複製代碼
結果以下:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "18",
"name": "geekdigging"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"Referer": "https://www.geekdigging.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
},
"json": null,
"origin": "116.234.254.11, 116.234.254.11",
"url": "https://httpbin.org/post"
}複製代碼
咱們在這個 POST 請求中添加了請求頭和參數。
上面咱們使用過 text 和 json 來獲取響應內容,除了這兩個,還有不少屬性和方法能夠用來獲取其餘信息。
咱們來訪問百度首頁演示一下:
import requests
r = requests.get('https://www.baidu.com')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print(type(r.cookies), r.cookies)
print(type(r.url), r.url)
print(type(r.history), r.history)複製代碼
結果以下:
<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 05 Dec 2019 13:24:11 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'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
<class 'str'> https://www.baidu.com/
<class 'list'> []複製代碼
這裏分別打印輸出 status_code
屬性獲得狀態碼,輸出 headers
屬性獲得響應頭,輸出 cookies
屬性獲得 Cookies ,輸出 url
屬性獲得 URL ,輸出 history
屬性獲得請求歷史。
本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。