本文由圖雀社區成員 燦若星空 寫做而成,歡迎加入圖雀社區,一塊兒創做精彩的免費技術教程,予力編程行業發展。若是您以爲咱們寫得還不錯,記得 點贊 + 關注 + 評論 三連🥰🥰🥰,鼓勵咱們寫出更好的教程💪css
這是一套基於實戰的系列教程,從最簡單的爬蟲程序開始,授人予漁,詳細剖析程序設計的思路,完整展示爬蟲是如何一步步調試到最終完成。分享關於爬蟲的各類知識、技巧,旨在幫助你們認識爬蟲、設計爬蟲、使用爬蟲最後享受爬蟲帶給咱們在工做和生活上的各類便利。html
基本的python編程知識前端
提及爬蟲每一個人都或多或少的聽過與之相關的內容,以爲它或高深、或有趣。做爲一名寫代碼四五年的初級碼農來看,爬蟲程序是計算機程序裏面最簡單也是最有趣的程序。只要會上網衝浪就有寫爬蟲程序的天賦。python
爬蟲爲何是蟲呢?由於蟲子的頭腦比較簡單,爬蟲程序也是 ++「一根筋」++ ,不須要諱莫如深的數學知識,也不用設計精巧的各種算法。咱們只須要用計算機能聽懂的「大白話」平鋪直敘就能夠啦。算法
一句話總結全部爬蟲程序的做用: 模擬人類上網的操做,以此來查找、下載、存儲數據。
接下來我要以 男人圖這個網站爲例,分享套路。編程
此處強烈推薦Chrome
首先打開這個網址:https://www.nanrentu.cc/sgtp/, 會看到如下界面數組
。瀏覽器
如今咱們只是用瀏覽器手動打開了這個頁面,接下來咱們要用代碼,讓程序也打開這個頁面。這就要分析一下瀏覽器是如何打開這個頁面的了,請看簡易流程圖。安全
在python中,可使用 requests 這一工具包來發送HTTP請求。爲了瞭解程序所「看到」 頁面是什麼樣子的,咱們須要把程序所獲得HTML文件保存到本地,而後再用瀏覽器打開,就能和程序感同身受了。從而達到「人機合一」的境界。服務器
光說不練假把式,讓咱們立刻來新建一個 index.py
文件,而後在其中編寫以下內容:
import requests url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'a',encoding="utf-8") as f: f.write(response.text)
在瀏覽器打開寫入的HTML文件是這樣的
這怎麼和在瀏覽器中看到的不同呢?
這個時候我就要亮出一件絕世寶貝————Chrome調試臺(按F12)來給您分析一波了。
其實咱們在瀏覽器中看到的頁面並不只僅是HTML頁面,而是css、js、html以及各類媒體資源綜合在一塊兒並有瀏覽器最終渲染而出頁面,紅框的部分,標出了在這個過程當中所加載的各個資源。
當咱們用程序去請求服務器時,獲得僅僅是HTML頁面,因此程序和咱們所看到的頁面就截然不同了。不過不要緊HTML是主幹,抓住了主幹其餘的只須要順藤摸瓜就能夠了。
打開這個網址之後,各位小仙女就能夠各取所需咯,想體驗蕭亞軒的快樂嘛?那目標就是小鮮肉;饞彭于晏的那樣的身子了?那肌肉帥哥就是你的菜。此外韓國歐巴,歐美型男也是應有盡有。
人類是高級生物,眼睛會自動聚焦的目標身上,可是爬蟲是「一根筋」啊,它可不會自動聚焦,咱們還得幫它指引道路。
寫過前端頁面的朋友都知道CSS樣式用過各類選擇器來綁定到對應的節點上,那麼咱們也能夠經過CSS的選擇器來選中咱們想要的元素,從而提取信息。Chrome中已經準備了CSS選擇器神器,能夠生成咱們想要元素的選擇器。
具體過程以下:第三步爲好好欣賞小哥哥們~
這個時候要介紹頁面解析神器pyquery,這個工具庫能夠經過咱們所複製的CSS選擇器,在 HTML 頁面中查找對應元素,而且能很便捷地提取各類屬性。那麼接下來咱們就把這個小哥哥解析出來吧。
咱們首先安裝 PyQuery
這個包,具體可使用 pip 包管理器安裝,而後將代碼修改爲以下這樣:
import requests from pyquery import PyQuery as pq url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) # 開始解析 doc = pq(response.text) # 把複製的選擇器粘貼進去 # 選擇對應的節點 imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') # 提取屬性,獲取圖片連接 imgSrc = imgElement.attr('src') # 將圖片連接輸出在屏幕上 print(imgSrc)
這麼好看的小哥哥怎麼能只讓他在互聯網上呆着呢?把他放進硬盤裏的學習資料文件夾裏纔是最安全的。接下來,咱們就把小哥哥放到碗裏來。
下載圖片的過程其實和抓取HTML頁面的流程是同樣的,也是利用 requests 發送請求從而獲取到數據流再保存到本地。
import requests from pyquery import PyQuery as pq url = "https://www.nanrentu.cc/sgtp/" response = requests.get(url) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') imgSrc = imgElement.attr('src') print(imgSrc) # 下載圖片 imgResponse = requests.get(imgSrc) if imgResponse.status_code == 200: # 填寫文件路徑 以二進制的形式寫入文件 with open('學習文件/boy.jpg', 'wb') as f: f.write(imgResponse.content) f.close()
此時先來看看效果
至此僅僅十多行代碼就完成了一個小爬蟲,是否是很簡單。其實爬蟲的基本思路就這四步,所謂複雜的爬蟲就是在這個四步的基礎上不斷演化而來的。爬蟲最終的目的是爲了獲取各類資源(文本或圖片),全部的操做都是以資源爲核心的。
經過上述步驟咱們只能獲取到一個小哥哥,集美們就說了,我直接右擊鼠標下載也能夠啊,幹嗎費勁寫爬蟲呢?那接下來,咱們就升級一波選擇器,把小哥哥們裝進數組,通通搞到碗裏來。
爲了之後寫代碼更方便,要先進行一個簡單的重構,讓代碼調理清晰。
重構後的代碼以下:
import requests from pyquery import PyQuery as pq def saveImage(imgUrl,name): imgResponse = requests.get(imgUrl) fileName = "學習文件/%s.jpg" % name if imgResponse.status_code == 200: with open(fileName, 'wb') as f: f.write(imgResponse.content) f.close() def main(): baseUrl = "https://www.nanrentu.cc/sgtp/" response = requests.get(baseUrl) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) imgElement = doc('body > div:nth-child(5) > div > div > div:nth-child(2) > ul > li:nth-child(3) > a > img') imgSrc = imgElement.attr('src') print(imgSrc) saveImage(imgSrc,'boy') if __name__ == "__main__": main()
有過前端編程經驗的同窗們能夠看出來,Chrome自動生成的選擇器指定了具體的某個子元素,因此就只選中了一個小哥哥,那麼接下來咱們要分析出通用的選擇器,把臭弟弟們一鍋端。
多拿着鼠標點點這個調試臺,一層層地看這個HTML文件的元素層級,找到其中相同重複的地方,這就是咱們的突破口所在。
咱們能夠看出圖片都在一個類名爲 h-piclist 的 <ul>
標籤中,那麼咱們可寫出如下的選擇器 .h-piclist > li > a > img
。這樣就選中了這一頁全部的圖片元素。接着用一個 for 循環遍歷就能夠了。
import requests from pyquery import PyQuery as pq # 引入UUID爲圖片命名 import uuid def saveImage(imgUrl,name): imgResponse = requests.get(imgUrl) fileName = "學習文件/%s.jpg" % name if imgResponse.status_code == 200: with open(fileName, 'wb') as f: f.write(imgResponse.content) f.close() def main(): baseUrl = "https://www.nanrentu.cc/sgtp/" response = requests.get(baseUrl) if response.status_code == 200: with open("result.html",'w',encoding="utf-8") as f: f.write(response.text) doc = pq(response.text) # 選則這一頁中全部的目標圖片元素 imgElements = doc('.h-piclist > li > a > img').items() # 遍歷這些圖片元素 for i in imgElements: imgSrc = i.attr('src') print(imgSrc) saveImage(imgSrc,uuid.uuid1().hex) if __name__ == "__main__": main()
能夠看出圖片的鏈接已經所有拿到了,可是當去下載圖片時卻發生了一些意外,請求圖片居然沒有反應。這是哪裏出了問題呢?圖片鏈接所有拿到,證實代碼沒毛病,把圖片連接放到瀏覽器里正常打開,證實鏈接沒毛病,那如今可能就是網絡有毛病了。
這時候因素不少,咱們首先用最簡單的方法來解決問題,斷線重連。把筆記本WIFI重啓,從新加入網絡,再運行程序。
驚喜來了,臭弟弟們成功入庫。
固然啦,這種方式並非銀彈,咱們須要有更多的技巧來提高爬蟲程序的「演技」,咱們的爬蟲程序表現的越像我的,那咱們獲取資源的成功率就會越高。
看到這裏,應該跨進爬蟲世界的大門了,若是這個世界有主題曲的話那麼必定是薛之謙的《演員》接下來的教程中會一遍磨礪「演技」,一遍獲取更多的小哥哥。
若是您以爲咱們寫得還不錯,記得 點贊 + 關注 + 評論 三連🥰🥰🥰,鼓勵咱們寫出更好的教程💪想要學習更多精彩的實戰技術教程?來圖雀社區逛逛吧。