第一章主要講解爬蟲相關的知識如:http、網頁、爬蟲法律等,讓大家對爬蟲有了一個比較完善的瞭解和一些題外的知識點。
今天這篇文章將是我們第二章的第一篇,我們從今天開始就正式進入實戰階段,後面將會有更多的實際案例。
爬蟲系列文章的第一篇,豬哥便為大家講解了HTTP原理,很多人好奇:好好的講爬蟲和HTTP有什麼關係?其實我們常說的爬蟲(也叫網絡爬蟲)就是使用一些網絡協議發起的網絡請求,而目前使用最多的網絡協議便是HTTP/S網絡協議簇。
一、Python有哪些網絡庫
在真實瀏覽網頁我們是通過鼠標點擊網頁然後由瀏覽器幫我們發起網絡請求,那在Python中我們又如何發起網絡請求的呢?答案當然是庫,具體哪些庫?豬哥給大家列一下:
- Python2: httplib、httplib2、urllib、urllib2、urllib3、requests
- Python3: httplib2、urllib、urllib3、requests
Python網絡請求庫有點多,而且還看見網上還都有用過的,那他們之間有何關係?又該如何選擇?
- httplib/2:這是一個Python內置http庫,但是它是偏於底層的庫,一般不直接用。而httplib2是一個基於httplib的第三方庫,比httplib實現更完整,支持緩存、壓縮等功能。一般這兩個庫都用不到,如果需要自己 封裝網絡請求可能會需要用到。
- urllib/urllib2/urllib3:urlliib是一個基於httplib的上層庫,而urllib2和urllib3都是第三方庫,urllib2相對於urllib增加一些高級功能,如:HTTP身份驗證或Cookie等,在Python3中將urllib2合併到了urllib中。urllib3提供線程安全連接池和文件post等支持,與urllib及urllib2的關係不大。
- requests:requests庫是一個基於urllib/3的第三方網絡庫,它的特點是:功能強大API優雅。由上圖我們可以看到,對於http客戶端python官方文檔也推薦我們使用requests庫,實際工作中requests庫也是使用的比較多的庫。
綜上所述,我們選擇選擇requests庫作為我們爬蟲入門的起點。另外以上的這些庫都是同步網絡庫,如果需要高併發請求的話可以使用異步網絡庫:aiohttp,這個後面豬哥也會為大家講解。
二、requests介紹
希望大家永遠記住:學任何一門語言,都不要忘記去看看官方文檔。也許官方文檔不是最好的入門教程,但絕對是最新、最全的教學文檔!
1.首頁
requests的官方文檔(目前已支持中文)鏈接:http://cn.python-requests.org源代碼地址:https://github.com/kennethreitz/requests
從首頁中讓HTTP服務人類這幾個字中我們便能看出,requests核心宗旨便是讓用戶使用方便,間接表達了他們設計優雅的理念。
注:PEP 20便是鼎鼎大名的Python之禪。
警告:非專業使用其他 HTTP 庫會導致危險的副作用,包括:安全缺陷症、冗餘代碼症、重新發明輪子症、啃文檔症、抑鬱、頭疼、甚至死亡。
2.功能特性
都說requests功能強大,那我們來看看requests到底有哪些功能特性吧:
- Keep-Alive & 連接池
- 國際化域名和 URL
- 帶持久 Cookie 的會話
- 瀏覽器式的 SSL 認證
- 自動內容解碼
- 基本/摘要式的身份認證
- 優雅的 key/value Cookie
- 自動解壓
- Unicode 響應體
- HTTP(S) 代理支持
- 文件分塊上傳
- 流下載
- 連接超時
- 分塊請求
- 支持 .netrc
requests 完全滿足今日 web 的需求。Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美運行
三、安裝requests
pip install requests
如果是pip3則使用
pip3 install requests
如果你使用anaconda則可以
conda install requests
如果你不想用命令行,可在pycharm中這樣下載庫
四、爬蟲流程
下圖是豬哥之前工作總結的一個項目開發流程,算是比較詳細,在開發一個大型的項目真的需要這麼詳細,不然項目上線出故障或者修改需求都無法做項目覆盤,到時候程序員就有可能背鍋祭天。。。
言歸正傳,給大家看項目的開發流程是想引出爬蟲爬取數據的流程:
- 確定需要爬取的網頁
- 瀏覽器檢查數據來源(靜態網頁or動態加載)
- 尋找加載數據url的參數規律(如分頁)
- 代碼模擬請求爬取數據
五、爬取某東商品頁
豬哥就以某東商品頁為例子帶大家學習爬蟲的簡單流程,為什麼以某東下手而不是某寶?因為某東瀏覽商品頁不需要登錄,簡單便於大家快速入門!
1.第一步:瀏覽器中找到你想爬取的商品
ps:豬哥並不是在開車哦,為什麼選這款商品?因為後面會爬取這款商品的評價做數據分析,是不是很刺激!
2.第二步:瀏覽器檢查數據來源
打開瀏覽器調試窗口是為了查看網絡請求,看看數據是怎麼加載的?是直接返回靜態頁面呢,還是js動態加載呢?
鼠標右鍵然後點檢查或者直接F12即可打開調試窗口,這裡豬哥推薦大家使用Chrome瀏覽器,為什麼?因為好用,程序員都在用!具體的Chrome如何調試,大家自行網上看教程!
打開調試窗口之後,我們就可以重新請求數據,然後查看返回的數據,確定數據來源。
3.第三步:尋找加載數據url的參數規律
我們可以看到第一個請求鏈接:https://item.jd.com/1263013576.html 返回的數據便是我們要的網頁數據。因為我們是爬取商品頁,所以不存在分頁之說。
當然價格和一些優惠券等核心信息是通過另外的請求加載,這裡我們暫時不討論,先完成我們的第一個小例子!
4.第四步:代碼模擬請求爬取數據
獲取url鏈接之後我們來開始寫代碼吧
<code>import requestsdef spider_jd():
"""爬取京東商品頁"""
url = 'https://item.jd.com/1263013576.html'
try:
r = requests.get(url) # 有時候請求錯誤也會有返回數據
# raise_for_status會判斷返回狀態碼,如果4XX或5XX則會拋出異常
r.raise_for_status()
print(r.text[:500]) except:
print('爬取失敗')if __name__ == '__main__':
spider_jd()/<code>
檢查返回結果
至此我們就完成了某東商品頁的爬取,雖然案例簡單,代碼很少,但是爬蟲的流程基本差不多,希望想學爬蟲的同學自己動動手實踐一把,選擇自己喜歡的商品抓取一下,只有自己動手才能真的學到知識!
六、requests庫介紹
上面我們使用了requests的get方法,我們可以查看源碼發現還有其他幾個方法:post、put、patch、delete、options、head,他們就是對應HTTP的請求方法。
這裡簡單給大家列一下,後面會用大量的案例來用而後學,畢竟枯燥的講解沒人願意看。
<code>requests.post('http://httpbin.org/post', data = {'key':'value'})
requests.patch('http://httpbin.org/post', data = {'key':'value'})
requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')/<code>
注:httpbin.org是一個測試http請求的網站,能正常回應請求
對於HTTP的幾種請求方法,沒做過RestFul API的同學並不是很清楚每個請求方式表達的含義,這裡給大家列一下:
- GET:獲取單個用戶:http://project.company.com/api/v1/users/{uid}
- POST:創建單個用戶:http://project.company.com/api/v1/users/{uid}
- PUT:完全替換用戶:http://project.company.com/api/v1/users/{uid}
- PATCH:局部更新用戶:http://project.company.com/api/v1/users/{uid}
- DELETE:刪除單個用戶http://project.company.com/api/v1/users/{uid}
想了解requests更多使用方法請參考:http://cn.python-requests.org
後面豬哥也會用大量案例來一點一點學習requests庫的一些使用技巧。
七、總結
今天為大家簡單介紹了一下這個非常重要的庫:requests,requests可以勝任很多簡單的爬蟲需求,它強大的功能以及優美的api得到一致的認同。
有人多同學會問:爬蟲到什麼境界才算是入門?
你會熟練使用requests庫去實現一些簡單的爬蟲功能就算入門,並不是說需要會各種框架才算是入門,相反能使用低級工具實現功能的才更具潛力!更多高深爬蟲源碼案例私信小編01獲取o~
閱讀更多 地表嘴強程序員 的文章