爬蟲養成記——先跨進這個精彩的世界(女生定製篇)

爬蟲養成記——先跨進這個精彩的世界(女生定製篇)

本文由圖雀社區成員 燦若星空 寫做而成,歡迎加入圖雀社區,一塊兒創做精彩的免費技術教程,予力編程行業發展。

若是您以爲咱們寫得還不錯,記得 點贊 + 關注 + 評論 三連🥰🥰🥰,鼓勵咱們寫出更好的教程💪css

發刊詞

這是一套基於實戰的系列教程,從最簡單的爬蟲程序開始,授人予漁,詳細剖析程序設計的思路,完整展示爬蟲是如何一步步調試到最終完成。分享關於爬蟲的各類知識、技巧,旨在幫助你們認識爬蟲、設計爬蟲、使用爬蟲最後享受爬蟲帶給咱們在工做和生活上的各類便利。html

預備知識

  1. 基本的python編程知識前端

    1. 這裏使用 Python3 做爲開發環境
    2. 同時具有基本的裝包知識
  2. 基本的網頁編程知識
  3. 初步瞭解HTTP協議

這是最簡單的計算機程序

提及爬蟲每一個人都或多或少的聽過與之相關的內容,以爲它或高深、或有趣。做爲一名寫代碼四五年的初級碼農來看,爬蟲程序是計算機程序裏面最簡單也是最有趣的程序。只要會上網衝浪就有寫爬蟲程序的天賦python

爬蟲爲何是蟲呢?由於蟲子的頭腦比較簡單,爬蟲程序也是 ++「一根筋」++ ,不須要諱莫如深的數學知識,也不用設計精巧的各種算法。咱們只須要用計算機能聽懂的「大白話」平鋪直敘就能夠啦。算法

開發爬蟲的基本套路

一句話總結全部爬蟲程序的做用: 模擬人類上網的操做,以此來查找、下載、存儲數據。
接下來我要以 男人圖這個網站爲例,分享套路。編程

step 1: 打開目標網址

此處強烈推薦Chrome

首先打開這個網址:https://www.nanrentu.cc/sgtp/, 會看到如下界面數組

3I7ph6.png瀏覽器

如今咱們只是用瀏覽器手動打開了這個頁面,接下來咱們要用代碼,讓程序也打開這個頁面。這就要分析一下瀏覽器是如何打開這個頁面的了,請看簡易流程圖。安全

3IHqeJ.png

在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文件是這樣的

3IqM36.png

3IqK9x.png

這怎麼和在瀏覽器中看到的不同呢?

這個時候我就要亮出一件絕世寶貝————Chrome調試臺(按F12)來給您分析一波了。
3ILhFA.png

其實咱們在瀏覽器中看到的頁面並不只僅是HTML頁面,而是css、js、html以及各類媒體資源綜合在一塊兒並有瀏覽器最終渲染而出頁面,紅框的部分,標出了在這個過程當中所加載的各個資源。

當咱們用程序去請求服務器時,獲得僅僅是HTML頁面,因此程序和咱們所看到的頁面就截然不同了。不過不要緊HTML是主幹,抓住了主幹其餘的只須要順藤摸瓜就能夠了。

step2:找到目標資源

打開這個網址之後,各位小仙女就能夠各取所需咯,想體驗蕭亞軒的快樂嘛?那目標就是小鮮肉;饞彭于晏的那樣的身子了?那肌肉帥哥就是你的菜。此外韓國歐巴,歐美型男也是應有盡有。

人類是高級生物,眼睛會自動聚焦的目標身上,可是爬蟲是「一根筋」啊,它可不會自動聚焦,咱們還得幫它指引道路。

寫過前端頁面的朋友都知道CSS樣式用過各類選擇器來綁定到對應的節點上,那麼咱們也能夠經過CSS的選擇器來選中咱們想要的元素,從而提取信息。Chrome中已經準備了CSS選擇器神器,能夠生成咱們想要元素的選擇器。

具體過程以下:第三步爲好好欣賞小哥哥們~

3o8dJg.png

step3:解析頁面

這個時候要介紹頁面解析神器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)

step4:存儲目標

這麼好看的小哥哥怎麼能只讓他在互聯網上呆着呢?把他放進硬盤裏的學習資料文件夾裏纔是最安全的。接下來,咱們就把小哥哥放到碗裏來。

下載圖片的過程其實和抓取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()

此時先來看看效果

3odp8K.png

四步蟲

至此僅僅十多行代碼就完成了一個小爬蟲,是否是很簡單。其實爬蟲的基本思路就這四步,所謂複雜的爬蟲就是在這個四步的基礎上不斷演化而來的。爬蟲最終的目的是爲了獲取各類資源(文本或圖片),全部的操做都是以資源爲核心的。

  1. 打開資源
  2. 定位資源
  3. 解析資源
  4. 下載資源

更多的小哥哥

經過上述步驟咱們只能獲取到一個小哥哥,集美們就說了,我直接右擊鼠標下載也能夠啊,幹嗎費勁寫爬蟲呢?那接下來,咱們就升級一波選擇器,把小哥哥們裝進數組,通通搞到碗裏來。

重構代碼

爲了之後寫代碼更方便,要先進行一個簡單的重構,讓代碼調理清晰。

  1. 增長入口函數
  2. 封裝對於圖片的操做

重構後的代碼以下:

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自動生成的選擇器指定了具體的某個子元素,因此就只選中了一個小哥哥,那麼接下來咱們要分析出通用的選擇器,把臭弟弟們一鍋端。

3oy7nK.png

多拿着鼠標點點這個調試臺,一層層地看這個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()

沒法下載的圖片

3o2Ygs.png

能夠看出圖片的鏈接已經所有拿到了,可是當去下載圖片時卻發生了一些意外,請求圖片居然沒有反應。這是哪裏出了問題呢?圖片鏈接所有拿到,證實代碼沒毛病,把圖片連接放到瀏覽器里正常打開,證實鏈接沒毛病,那如今可能就是網絡有毛病了。

  1. 網速慢
  2. 網絡波動
  3. 對方網站有防爬措施
  4. ……

這時候因素不少,咱們首先用最簡單的方法來解決問題,斷線重連。把筆記本WIFI重啓,從新加入網絡,再運行程序。

驚喜來了,臭弟弟們成功入庫。

3o2T8H.png

固然啦,這種方式並非銀彈,咱們須要有更多的技巧來提高爬蟲程序的「演技」,咱們的爬蟲程序表現的越像我的,那咱們獲取資源的成功率就會越高。

看到這裏,應該跨進爬蟲世界的大門了,若是這個世界有主題曲的話那麼必定是薛之謙的《演員》接下來的教程中會一遍磨礪「演技」,一遍獲取更多的小哥哥。

若是您以爲咱們寫得還不錯,記得 點贊 + 關注 + 評論 三連🥰🥰🥰,鼓勵咱們寫出更好的教程💪

想要學習更多精彩的實戰技術教程?來圖雀社區逛逛吧。

相關文章
相關標籤/搜索