Python爬蟲學習1: Requests模塊的使用


Requests函數庫是學習Python爬蟲必備之一, 能夠幫助我們方便地爬取. Requests: 讓HTTP服務人類. 本文主要參考了其官方文檔.

Requests具有完備的中英文文檔, 能完全滿足當前網絡的需求, 它使用了urllib3, 擁有其所有的特性! 

Requests安裝:

  requests目前的版本是v2.11.1, 在WINDOWS上可以通過命令行窗口(運行cmd命令), 利用pip進行自動地安裝(很方便):

> pip install requests
Collecting requests
Downloading requests-2.11.1-py2.py3-none-any.whl <514kB>
Installing collected packages: requests
Successfully installed requests-2.11.1

向網站發送請求:requests.get(url)

>>> import requests
 
# 請求豆瓣讀書網站點
>>> r = requests.get('https://book.douban.com/') # 返回一個實例,包含了很多的信息
>>> r.status_code  # 響應狀態碼,200表示服務器已成功處理了請求
200
>>> r.headers['content-type'] # 瀏覽器根據該參數決定對文檔進行如何解析,text是文檔類型,html則是文檔子類型;
'text/html; charset=utf-8'
>>> r.encoding # 所請求網頁的編碼方式
'utf-8'
>>> r.text # 所請求網頁的內容
...
>>> r.cookie # 網頁的cookie內容
<RequestsCookieJar[Cookie(version=0, name='bid', value='mGadkt5VXtk', port=None, port_specified=False, domain='.douban.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1508551773, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
>>> r.headers # 網頁的頭
{'X-Xss-Protection': '1; mode=block', 'X-DAE-App': 'book', 'X-Content-Type-Options': 'nosniff', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', 'Set-Cookie': 'bid=mGadkt5VXtk; Expires=Sat, 21-Oct-17 02:09:33 GMT; Domain=.douban.com; Path=/', 'Expires': 'Sun, 1 Jan 2006 01:00:00 GMT', 'Vary': 'Accept-Encoding', 'Keep-Alive': 'timeout=30', 'X-DAE-Node': 'dis16', 'X-DOUBAN-NEWBID': 'mGadkt5VXtk', 'X-Douban-Mobileapp': '0', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'must-revalidate, no-cache, private', 'Date': 'Fri, 21 Oct 2016 02:09:33 GMT', 'Strict-Transport-Security': 'max-age=15552000;', 'Server': 'dae', 'Content-Type': 'text/html; charset=utf-8'}
>>> r.url # 實際的網址
u'https://book.douban.com/'

       HTTP定義了與服務器進行交互的不同方式, 其中, 最基本的方法有四種: GET, POST, PUT, DELETE; 一個URL對應着一個網絡上的資源, 這四種方法就對應着對這個資源的查詢, 修改, 增加, 刪除四個操作.上面的程序用到的requests.get()來讀取指定網頁的信息, 而不會對信息就行修改, 相當於是"只讀". requests庫提供了HTTP所有基本的請求方式, 都是一句話搞定: 

1 r = requests.post('https://book.douban.com/')
2 r = requests.put('https://book.douban.com/')
3 r = requests.delete('https://book.douban.com/')
4 r = requests.head('https://book.douban.com/')
5 r = requests.options('https://book.douban.com/')

向URL傳遞參數:requests.get(url, param=None)

  參考附錄1可知,一個URL的?后面跟隨的是查詢(query)字符串, 現在我們手工構建URL, 向URL的后面傳遞查詢字符串. request.get()的第二個參數允許我們使用params關鍵字參數,以一個字典的形式來提供參數, 比如我們想傳遞key1=value1,key2=value2到http://httpbin.org/get里面,可以這樣做:

>>> param = {'key1':'value1', 'key2':'value2'}  # 先生成一個字典 >>> param
{'key2': 'value2', 'key1': 'value1'}
>>> r = requests.get('http://httpbin.org/get', params = param)
>>> r.url
u'http://httpbin.org/get?key2=value2&key1=value1'  # 可以看到,參數之間用&隔開,參數名和參數值之間用=隔開

# 還可以將一個列表作為參數值傳入 >>> param = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> param {'key2': ['value2', 'value3'], 'key1': 'value1'} >>> r = requests.get('http://httpbin.org/get', params=param) >>> r.url u'http://httpbin.org/get?key2=value2&key2=value3&key1=value1'

響應內容:

      現在我們可以對服務器響應的內容進行讀取, 響應的內容存放在了r.text里面. 

>>> r = requests.get('https://www.douban.com/')
>>> r.status_code
200>>> r.encoding
'utf-8'

圖1 在豆瓣網上"查看源代碼"得到的部分內容

圖2 r.text的部分內容

圖3 r.content的部分內容 

從圖1,圖2可以看出: 1) 網頁響應的內容就是網頁的源代碼.2) r.text和r.content都是經過了編碼的,圖1和圖2中紅線部分為"提供圖書"的編碼:圖1為Unicode編碼16進制,圖2為'ISO-8859-1'編碼.

圖4 "提供圖書"四個漢字的編碼

  當你訪問r.text之時,requests會使用r.encoding的編碼格式進行編碼, 如果你把r.encoding的值改變了, 再訪問t.text的時候, 它就會按照新的編碼形式進行編碼.如下所示將'utf-8'編碼改成'ISO-8859-1',再訪問r.text,得到如圖5所示的內容:

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

圖5 用了'ISO-8859-1'的編碼

那r.text和r.content的區別是什么呢? 

  r.text是unicode編碼的響應內容(r.text is the content of the response in unicode), r.content是字符編碼的響應內容(r.content is the content of the response in bytes); text屬性會嘗試按照encoding屬性自動將響應的內容進行轉碼后返回,如果encoding為None,requests會按照chardet(這是什么?)猜測正確的編碼; 如果你想取文本,可以通過r.text, 如果想取圖片,文件,則可以通過r.content(這點我現在也不是很明白).針對響應內容是二進制文件(如圖片)的場景,content屬性獲取響應的原始內容(以字節為單位),例如:

from PIL import Image
from io import BytesIO

r = requests.get('http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg')
i = Image.open(BytesIO(r.content)) # 得到圖像
i.save('sample.jpg', 'jpeg')       # 保存圖像

圖6 圖片的r.content內容

JSON響應內容:

requests內置了一個JSON解碼器, 幫助處理JSON數據,JSON的簡介見附錄2.

>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
{u'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events', u'message': u'Hello there, wayfaring stranger. If you\u2019re reading this then you probably didn\u2019t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.'}
>>> r.json
<bound method Response.json of <Response [410]>>

 

 

附錄:

1.URL組成: 

基本的URL的格式為: "協議://授權/路徑?查詢", 如在百度上分別搜索"Brad Pitt"和"url", 出來的URL如下所示, 協議為: https(用安全套接字層傳送的超文本傳輸協議), 授權為: www.baidu.com, 路徑為: s, 查詢為: ?后面的一坨

搜索"Brad Pitt", 出來的URL是:https://www.baidu.com/s?wd=Brad%20Pitt&rsv_spt=1&rsv_iqid=0xf7315fbc0002f13b&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2&rsv_n=2&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=364&rsv_sug4=530&rsv_sug=1

搜索"url", 出來的URL是:https://www.baidu.com/s?wd=url&rsv_spt=1&rsv_iqid=0xed90010e00032652&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1

URL由三部分組成: 資源類型, 存放資源的主機域名, 資源文件名. URL的一般語法為([]里面的為可選項): protocol://hostname[:port]/path/[:parameters][?query]#fragmentpro

protocol: 協議,最常用的是HTTP協議;hostname: 主機名,指用來存放資源的服務器的域名系統(DNS)主機名或IP地址;post: 端口號,整數,可選,各種協議都有默認的端口號(http的80端口),忽略的時候采用方案的默認端口; path: 路徑, 一般用來表示主機上的一個目錄或者文件地址; parameters: 參考(可選),用於指定特殊參數.query: 查詢,用於給動態網頁(如使用PHP/ASP/NET的技術制作的網頁)傳遞參數,可以有多個參數, 用符號"&"隔開,每個"參數名:參數值"用"="隔開. fragment: 信息片段,是個字符串,用於指定網絡資源中的片段. 

2.JSON:

  JSON(JavaScript Object Notation)是一種輕量級的數據交換格式, 作為數據交換語言, 易於人閱讀和編寫, 同時也易於機器解析和生成. JSON數據的書寫格式是: 名稱:值 對.中間用:隔開(這個就像python的dict定義嘛). 如: r'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events'

參考:

[1] Python爬蟲利器一之Requests庫的用法: https://cuiqingcai.com/2556.html 

[2] Requests: 讓HTTP服務人類(中文官方文檔): http://cn.python-requests.org/zh_CN/latest/ 

[3] http://docs.python-requests.org/zh_CN/latest/user/advanced.html 

[4] 淺談HTTP中Get與Post的區別: http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

[5] W3School-HTML/CSS: http://www.w3school.com.cn/html/html_forms.asp 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM