1. 程式人生 > 實用技巧 >python來爬取煎蛋網隨手拍小姐姐圖片

python來爬取煎蛋網隨手拍小姐姐圖片

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:程式設計師喧嘯

本文使用了requests模組進行傳送請求,使用了BeautifulSoup模組對網頁進行解析,在使用之前首先安裝這兩個第三方庫;方法如下:

1.安裝requests庫

pip install requests

2. 安裝bs4庫

pip install bs4

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

首先

我們開啟煎蛋網,看到了首頁上面有資訊---隨手拍,而我們的主要任務就是爬取隨手拍的圖片將其進行儲存。

忘了說,網址是這個

http://jandan.net/ooxx/MjAyMDA4MDctMTMz#comments

接下來

開始分析網頁原始碼,提取相關資訊。那我們以什麼樣的思路來進行爬蟲的設計呢?稍加思考,聰明的你立即有了想法,我們首先爬取整張網頁的資訊,之後在該網頁中提取原圖的儲存地址,最後通過請求圖片的地址,將圖片進行儲存。我們大體上有了一個思路,開始最有趣並且好玩的程式碼編寫吧。

  • 首先右擊頁面選擇審查元素(快捷鍵為Fn+F12),之後再點選左上角的定位符號來定點陣圖片被存在哪一個標籤裡面。
  • 其次我們要將該頁面的原始碼爬取下來,以便於下一步解析網頁,直接上程式碼來分析。

對以下程式碼的註釋:

  1. 我們可以看到定義了一個函式get_totle_page(url),說的高大上一點,我們採用了模組化的程式設計思想;
  2. 此處我們說另外一個高大上的名詞,即UA偽裝,現在好多網站都建立了反爬蟲機制,UA偽裝便是為了告訴瀏覽器我們的身份是一個瀏覽器,而不是一個爬蟲,防止被限制訪問。
  3. global headers 由於接下來我們需要訪問圖片的地址,傳送請求資訊將其儲存下來,所以我們將headers定義為全域性變數,方便請求圖片的時候使用。
  4. 很明顯,程式中我們還加入了異常處理機制,可以這麼理解,當程式連線失敗的時候進行異常處理,返回值為None。
def get_totle_page(url):
    
global headers headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36' } try: response = requests.get(url ,headers =headers) if response.status_code == 200: return response.text except requests.ConnectionError: print("請求資料失敗!!!") return None

通過以上的操作,我們發現圖片儲存在<div id = "comments">裡面的<ol class= "commentlist">下的每個<li>標籤裡面。其原圖的地址儲存在<li>裡面的<div class = "text">下的<p>標籤中的<a class = "view_img_list">標籤的屬性值"href"中。

這一步是將圖片的地址連結解析出,我的想法是建立一個空列表totle_list = []進行儲存圖片的地址連結。還是一樣的風格,簡單粗暴,直接上程式碼。

我們使用的是BeautifulSoup來解析網頁,先來“煲一鍋湯”

soup = BeautifulSoup(html,"lxml")

前面我們分析了圖片的具體儲存的標籤位置,下面進行解析:

    div = soup.find('div',attrs = {'id':'comments'})
    ol_list = div.find(name = 'ol')

    for ol in ol_list.find_all(name = 'li'):
        try:
            text_list = ol.find('div',attrs = {'class':'text'})
            #print(text_list)
            global a_list
            a_list = 'http:' + text_list.p.a['href']
            #print(a_list)
            totle_list.append(a_list)
        except:
            pass
    #print(totle_list)
    return totle_list

需要特別說明的一點,在煎蛋網隨手拍的網頁上面有廣告資訊,然而廣告資訊也儲存在<li>標籤裡面,所以在解析的過程我們需要跳過儲存廣告的<li>標籤進行解析圖片,所以我們加入了異常處理機制,若<li>標籤裡面沒有<div class = "text">,直接跳過該標籤,解析下一個<Li>標籤。

最後,我們將儲存著圖片地址的連線都儲存在了列表totle_list裡面。

再下來

我們就需要將解析的圖片地址連結進行二進位制資料的本地儲存了,為了保持我們一貫的整潔作風,咳咳咳,此處需要來一張圖修飾一下······

我們建立一個資料夾來存放所有的照片。

有意無意的插上一句,os庫是python的內建庫,在使用之前不需要特殊進行安裝,呼叫即可。

    if not os.path.exists('./picture_Libs'):
        os.mkdir('./picture_Libs')

接下來進行請求圖片的地址連結,將圖片進行本地的儲存。

  1. 迴圈遍歷請求totle_list裡面儲存的圖片的地址連結,圖片是二進位制檔案,所以使用了response.content。
  2. img_path = './picture_Libs/' + totle.split('/')[-1]

對於該語句是說明了圖片的本地儲存地址,我們選的是新建的資料夾下面,用split()語句以“/”對地址連線進行分割,選擇分割之後的最後一部分作為圖片的名字來進行儲存。

    for totle in totle_list:
    
        try:
            response = requests.get(url=totle, headers=headers)
            if response.status_code == 200:
                response.encoding = response.apparent_encoding
                img_data = response.content
        except TimeoutError:
            print('請求超時!!!')

        img_path = './picture_Libs/' + totle.split('/')[-1]
        #print(img_path)
        with open(img_path,'wb') as fp:
            fp.write(img_data)

最後

我們通過主函式將我們的各個功能模組串聯起來,話不多說,上完整程式碼啦。

  1. 我爬取的url是"http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
  2. 在爬取煎蛋網隨手拍的時候,可自行去觀察url的不同,來尋找規律,來構建url進行爬取。
import requests
from bs4 import BeautifulSoup
import lxml
import os

def get_totle_page(url):
    global headers
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    try:
        response = requests.get(url ,headers =headers)
        if response.status_code == 200:
            return response.text
    except requests.ConnectionError:
        print("請求資料失敗!!!")
        return None

def get_content_page(html):
    soup = BeautifulSoup(html,"lxml")
    totle_list = []
    div = soup.find('div',attrs = {'id':'comments'})
    ol_list = div.find(name = 'ol')

    for ol in ol_list.find_all(name = 'li'):
        try:
            text_list = ol.find('div',attrs = {'class':'text'})
            #print(text_list)
            global a_list
            a_list = 'http:' + text_list.p.a['href']
            #print(a_list)
            totle_list.append(a_list)
        except:
            pass
    #print(totle_list)
    return totle_list

def save_img_list(message):
    if not os.path.exists('./picture_Libs'):
        os.mkdir('./picture_Libs')
    for totle in message:
        try:
            response = requests.get(url=totle, headers=headers)
            if response.status_code == 200:
                response.encoding = response.apparent_encoding
                img_data = response.content
        except TimeoutError:
            print('請求超時!!!')

        img_path = './picture_Libs/' + totle.split('/')[-1]
        #print(img_path)
        with open(img_path,'wb') as fp:
            fp.write(img_data)

def main():
    for i in range(6):
        url = "http://jandan.net/ooxx/MjAyMDA4MDctMTI" +str(i) + "#comments"
    html = get_totle_page(url)
    message = get_content_page(html)
    #print(html)
    save_img_list(message)
    
if __name__ == "__main__":
    main()

執行程式之後,我們發現了好多好看的小姐姐儲存在了我建立的資料夾裡面,哇,沒想到一開啟一張就是一個背影殺手呀,我這該死的運氣。