爬蟲 之Requests庫的詳細使用

1、什麼是Requests?

Requests是用Python語言編寫的,基於urllib3來改寫的,採用Apache2 Licensed 來源協議的HTTP庫。

它比urllib更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求。

一句話---Python實現的簡單易用的HTTP庫。

1.1基本用法

安裝Requests

pip3 install requests

#各種請求方式:常用的就是requests.get()和requests.post()
>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

1.3 GET 請求

首先,構建一個最簡單的GET請求,請求的鏈接為http://httpbin.org/get,該網站會判斷如果客戶端發起的是GET 請求的話,他返回相應的請求信息:

import requests

r = requests.get('http://httpbin.org/get')
print(r.text)

帶參數GET請求

可以發現,我們成功發起了GET請求,返回結果中包含請求頭,URL,IP等信息。

那麼,對於GET 請求,如果要附加額外的信息,一般怎麼添加呢?在URL後面拼接,用一個?來分割一下,參數傳過來然後用&的符號來進行分割,比如現在想添加兩個參數,其中name是germery,age是22.喲構造這個請求鏈接,是不是可以直接寫成:

r = requests.get('http://httpbin.org/get?name=germery&age=22')

這樣也可以,但是一般情況下,這種信息數據會用字典來存儲。那麼怎麼構造這個鏈接呢?---->利用params這個參數就好了,示例如下:

import requests

data = {
    'name':'germary',
    'age':22
}

r = requests.get('http://httpbin.org/get',params=data)
print(r.text)

通過運行結果可以判斷,請求的鏈接自動被構成了:http://httpbin.org/get?name=germery&age=22。

解析json

另外,網頁的返回類型實際上是str類型,但是他很特殊,是JSON格式的。所以,如果想直接解析返回結果,得到一個字典格式的話,可以直接調用json()方法,示例如下:

import requests
r = requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

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

但需要注意的是,如果返回的結果不是JSON 格式,便會出現解析錯誤,拋出json.decoder.JSONDecoderError異常。

#如果查詢關鍵詞是中文或者有其他特殊符號,則不得不進行url編碼 from urllib.parse import urlencode wb = "haiyan海燕" encode_res = urlencode({"k":wb},encoding="utf-8") print(encode_res) #k=haiyan%E6%B5%B7%E7%87%95 keywords = encode_res.split("=")[1] #haiyan%E6%B5%B7%E7%87%95 url = "https://www.baidu.com/s?wd=%s&pn=1"%(keywords) # url = "https://www.baidu.com/s?"+encode_res print(url) # 然後拼接成url response = requests.get( url, headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36", }


抓取網頁

上面的請求鏈接返回的是JSON形式的字元串,那麼如果請求普通的網頁,則肯定能獲得相應的內容了。下面以『』知乎『』----->『』發現『』頁面為例來看一下:

import requests

import re

headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) '
                 'Chrome/72.0.3626.121 Safari/537.36'

}

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)

這裡我們加入headers信息,其中包含了User-Agent欄位信息,也就是瀏覽器標識信息。如果不加這個,知乎會禁止抓取。

接下來我們用到了最基礎的正則表達式來匹配出所有的問題內容。關於正則表達式的內容我會單獨寫篇博客,這裡作為實例來配合講解。

運行結果如下:

['\n如何進行完備而高效的法律檢索?\n', '\n怎樣用C語言畫出一個佛祖?\n', '\n撿到狗是什麼體驗?\n', '\n為什麼男生追到一半就不追了?\n', '\n野比大雄為什麼被稱為野比海皇,具體有哪些事迹?\n', '\n人的努力可以有多可怕?\n', '\n你遇到過最有教養的人是什麼樣的?\n', '\n歐美有沒有中國當代作家的書賣的很好,任何行業的都行?\n', '\n德雲社的哪個演員最會說話/雙商高?\n', '\n為什麼路飛的船停在碼頭敵人都不會破壞船呢?\n']

我們發現,這裡成功的提取出了所有的問題內容。

抓取二進位數據

在上面的例子中,我們抓取的是知乎的一個頁面,實際上他返回的是一個HTML文檔。如果想要抓取圖片、音頻、視頻、等文件,應該怎麼辦呢?

圖片、音頻、視頻這些文件本質上都是有二進位碼組成的,由於有特定的保存格式和對應的解析方式,我們才可以看到這些形形色色的多媒體。所以,想要抓取他們,就要拿到他們的二進位碼。

下面以GitHub的站點圖標為例來看一下:

import requests

response = requests.get('https://github.com/favicon.ico')

print(response.text)
print(response.content)

這裡抓取的內容是站點圖標,也就是瀏覽器在每一個標籤上的小圖標,如下圖所示

這裡列印了Response對象的兩個屬性,一個是text,一個是content。

運行結果如下圖所示,其中前兩行是response.text的結果,最後一行是response.content的結果。

可以注意到的,前者出現了亂碼,後者結果前帶了一個b,這代表是bytes類型的數據。由於圖片是二進位數據,所以前者在列印是轉化為str類型,也就是圖片直接轉化為字元串,這理所當然會出現亂碼。

接著,我們將剛才的提取到的圖片保存下來:

import requests
response = requests.get('https://github.com/favicon.ico')
with open('favicon.ico','wb')as f:
    f.write(response.content)

這裡用了open()方法,他的第一個參數是文件名稱,第二個參數以二進位寫的形式打開,可以向文件里寫入二進位數據。

運行結束之後,可以發現在文件夾中出現了名為favicon.ico的圖標,如圖:

同樣的,音頻和視頻文件也可以用這種方式獲取。

添加headers

與urllib.request一樣,我們也可以通過headers參數來傳遞頭信息。

比如,在上面『』知乎『』的例子中,如果不傳遞headers,就不能正常請求:

但是如果加上headers並加上User-Agent信息,那就沒問題了:

當然,我們可以在headers這個參數中任意添加其他的欄位信息。


1.4 POST請求

前面我們了解了最基本的GET 請求,另外一種比較常見的請求方式是POST。使用requesrs實現POST請求同樣非常簡單,示例如下:

import requests

data = {
    'name':'germey',
    'age':'22'
}

r = requests.post('http://httpbin.org/post',data=data)
print(r.text)

這裡還是請求http://httpbin.org/post,該網站可以判斷如果請求是POST方式,就把相關請求信息返回。

運行結構如下:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "22", 
    "name": "germey"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "18", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.21.0"
  }, 
  "json": null, 
  "origin": "139.226.173.216, 139.226.173.216", 
  "url": "https://httpbin.org/post"
}

可以發現,我們成功獲得了返回結果,其中form部分就是提交的數據,這就證明POST請求成功發送了。

1.5 響應

發送請求後,得到的自然就是響應。在上面的實例中,我們使用text和content獲取了響應的內容。此外,還有很多屬性和方法可以用來獲取信息,比如狀態碼、響應頭、Cookies等。示例如下:

import requests

r = requests.get('http://www.jianshu.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)

這裡分別打出輸出 status-code屬性得到狀態碼,輸出 headers屬性得到響應頭,輸出 cookies屬性得到cookies,輸出 url得到URL,輸出 history屬性得到請求歷史。

運行結果如下:

<class 'int'> 403
<class 'requests.structures.CaseInsensitiveDict'> {'Server': 'Tengine', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Thu, 07 Mar 2019 11:58:21 GMT', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Content-Encoding': 'gzip', 'x-alicdn-da-ups-status': 'endOs,0,403', 'Via': 'cache25.l2nu17-1[4,0], cache19.l2nu17[4,0], cache3.cn550[86,0]', 'Timing-Allow-Origin': '*', 'EagleId': '24faeb4315519599018091620e'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[]>
<class 'str'> https://www.jianshu.com/
<class 'list'> [<Response [301]>]

因為session_id太長,再次簡寫,可以看到,headers和cookies這兩個屬性得到的結果分別是CaseInsensitiveDict和RequestsCookieJar類型。

狀態碼判斷

狀態碼常用來判斷請求是否成功,而requests海亭公路一個內置的狀態碼查詢對象request.code,示例如下:

import requests


r = requests.get('http://www.jianshu.com')

exit() if not r.status_code == requests.codes.ok else print('Request Successfully')

這裡通過比較返回碼和內置的成功的返回碼,來保證請求得到了正常響應,輸出成功請求的消息,否則程序終止,這裡我們用request.code.ok得到的是成功的狀態碼200.


那麼肯定不能只有ok這個條件碼。下面列出了返回碼和相應的查詢條件:

信息狀態碼

成功狀態碼

重定向狀態碼

客戶端錯誤狀態碼

服務端錯誤狀態碼

高級操作

在上滿我們了解了requests的基本用法,如基本的GET、POST請求以及Response對象,接下來,我們再來了解下request的一些高級用法,如上傳文件、Cookies設置。代理設置等。

1、文件上傳

我們知道requests可以模擬提交一些數據。假如有的網站需要上傳文件,我們也可以用它來實現。這非常簡單,示例如下:

import requests

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

在之前我們保存了一個文件 favicon.ico,這次試用它來模擬文件上傳的過程。需要注意的是,favicon.ico 需要和當前腳本在同一目錄下。如果有其他文件,當然可以使用其他文件來上傳,更改下代碼即可。

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:application/octet-stream;base64,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AAAAAAAAKysrBhYWGUcWFhiVFRUYvxUVGNkWFhfzFhYX8xUVGNkVFRi/FhYYlRYWGUcrKysGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "6665", 
    "Content-Type": "multipart/form-data; boundary=bc5b787ed0aaa230edb1b69ac4c30b65", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.21.0"
  }, 
  "json": null, 
  "origin": "139.226.173.216, 139.226.173.216", 
  "url": "https://www.httpbin.org/post"
}

這個網站會返迴響應,裡面包含files這個欄位,而form欄位是空的,說明文件上傳部分會單獨有一個files欄位來標識。

Cookies

前面我們使用urllib處理過Cookies,寫法比較複雜,而有了requests,獲取和設置Cookies只需一步即可完成。

我們先用一個實例看一下獲取Cookies的過程:

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)

for key,value in r.cookies.items():
    print(key + '=' + value)

運行結果如下:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

這裡我們首先調用 Cookies 屬性即可成功得到Cookies,可以發現它是RequestsCookieJar類型。

然後用items()方法將其轉化為元組組成的列表,遍歷輸出每一個Cookies的名稱和值,實現Cookies的遍歷解析。

當然,我們也可以直接用Cookies來維持登錄狀態,下面以知乎為例來說明。首先登錄知乎,將Headers中的Cookies內容複製下來,如下圖所示:

Headers中的Cookies

cookie: _zap=e521c080-1303-4d99-ab5f-8ac180ec6688; _xsrf=bHjCx4sOokNf4gbxOfPSZiXpy6ql8x08; d_c0="ANBgHk5FFg-PTtXfZVwUnV1ZKgwKVqET2ao=|1551972600"; capsion_ticket="2|1:0|10:1551972647|14:capsion_ticket|44:NjdiNGU5MGMzYjlkNDg2MThjZTllYjU1MTQxMzk4ZDE=|ef3c8af44b4003a5c888809fc5983a6604c98ab3f4a7692b0b394aaf2a3f1aac"; tgw_l7_route=578107ff0d4b4f191be329db6089ff48; z_c0="2|1:0|10:1551972730|4:z_c0|92:Mi4xSExXQkNBQUFBQUFBMEdBZVRrVVdEeVlBQUFCZ0FsVk5lb2R1WFFDQjZUNC1kS29EYkJlcHlKSkNyZW1BMWwtQURB|3df7c4c89ca396eef71e2e6793cee37511f5415d33e8ead60500d245bb29dc7b"

這裡可以替換成你自己的Cookies,將其設置到Headers裡面,然後發送請求,示例如下:

當然,我們也可以通過cookies參數來設置,不過這樣就需要構造RequestsCookieJar對象,而且需要分割一下cookies。這相對繁瑣,不過效果還是相同的,示例如下:

會話維持

在requests中,如果直接利用get()或post()等方法的確可以做到模擬網頁的請求,但是這實際上是相當於不同的會話,也就是說相當於你用了兩個瀏覽器打開了不同的頁面。

設想這樣一個場景,第一個請求用post()方法登錄了某個網站,第二次想獲取成功登陸後的自己的個人信息,你有用了一次get()方法去請求這個人信息頁面。實際上,這相當於打開了兩個瀏覽器,是兩個完全不相關的會話,能成功獲取個人信息嗎?那當然不能。

SSL證書驗證

代理設置

對於某些網站,在測試的時候請求幾次,能正常獲取內容。但是一旦開始大規模爬取,對於大規模且頻繁的請求,網站可能會彈出驗證碼,或者跳到登錄認證頁面,更甚至可能會直接封禁客戶端的IP,導致一段時間內無法訪問。

那麼為了防止這種情況發生,我們需要設置代理來解決這個問題,這就需要用到proxies參數。可以用這樣的方式設置:

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)
import requests

proxies = {
    'http':'http://user:password@10.10.1.10:3128',

}

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

超時設置

在本機網路不好或者伺服器網路延遲響應太慢甚至無響應時,我們可能會等待特別就得時間才可能收到響應,甚至到最後收不到響應而報錯。為了防止伺服器不能及時響應,應該設置一個超時時間,即超過了這個時間還沒得到響應,那就報錯。這需要用到timeout這個參數。這個時間的計算是發出請求到伺服器返迴響應的時間。示例如下:


身份認證

Prepared Request

原文鏈接:https://www.cnblogs.com/zhangrenguo/p/10491821.html