用python爬蟲爬取壁紙圖片(入門級代碼)


我剛接觸python爬蟲,正想要一個練手項目,所以選擇從爬取靜態頁面開始,開啟我的爬蟲之旅

 

本次要爬取的網站是:

彼岸桌面壁紙:http://www.netbian.com/weimei/index.htm

 

先上代碼:

 

import requests
from bs4 import BeautifulSoup
import os
import re
​
​
def getHtmlurl(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        # 有效的判斷網絡連接的狀態。如果網連接出現錯誤,那么它就會用try-except來獲取一個異常。
        r.encoding = r.apparent_encoding
        # 設置編碼格式為 從內容中分析出的相應內容編碼方式
        return r.text
    except:
        return "出現異常"
​
​
def getimgurl(img):
    href = img['href']
    url = "http://www.netbian.com" + href
    htm = getHtmlurl(url)
    soup = BeautifulSoup(htm, 'html.parser')
    # htm 表示被解析的html格式的內容
    # html.parser表示解析用的解析器
    return soup
​
​
def getpic(html):
    soup = BeautifulSoup(html, 'html.parser')
    all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'href': re.compile('^((?!http).)*$'),
                                                                              'target': '_blank'})
​
    for img in all_img:
        title = img['title']
        if title.find(u"女") != -1:
            # 你可以自定義規則來篩選你想要的壁紙
            print("不符合要求,跳過")
            continue
​
        soup1 = getimgurl(img)
        im1 = soup1.find('div', id='main').find('div', class_='endpage').find('p').find('img')
​
        img_url = im1['src']
        print(img_url)
​
        root = 'D:/pictest2/'
        # 這是你要保存圖片的位置
        t = title.split()
        # 將圖片title按空格分開,取第一個空格前的字符作為圖片名,這個你可以自己調整
        path = root + t[0] + '.jpg'
​
        try:
            if not os.path.exists(root):
                os.mkdir(root)
            if not os.path.exists(path):
                r = requests.get(img_url)
                with open(path, 'wb') as f:
                    f.write(r.content)
                    f.close()
                    print('文件保存成功')
            else:
                print('文件已存在')
        except Exception as e:
            print(str(e))
            print('爬取失敗')
​
​
def getNextpage(html):
    soup = BeautifulSoup(html, 'html.parser')
    nextpage = soup.find('div', class_='list').find('ul').find('li', class_='nextpage').find('a')
    href = nextpage['href']
    url = "http://www.netbian.com" + href
    return url
​
​
def main():
    url = 'http://www.netbian.com/weimei/index.htm'
    for i in range(1, 10):
        html = getHtmlurl(url)
        print(str(i) + " : ")
        getpic(html)
        url = getNextpage(html)
​
​
if __name__ == '__main__':
    main()
​

  

 

☞現在我們來分析一下爬取壁紙的步驟:

 

從做事步驟來看
  1. 查看網頁的源代碼,挖掘其特征,找出自己要爬取的部分,對於我們的壁紙爬取,找到的就是圖片的網址

  1. 下載該網址的圖片到本地文件中

 

從編寫代碼來看
  1. 得到網頁全部源代碼

  1. 從源代碼中找到自己要的部分,並想法將它提取出來

  2. 將圖片下載到本地

 

☞知道我們的目的和思路后,我們來編寫代碼

 

  1. 我們要先得到網頁的全部源代碼,這里需要用到我們的requests庫

 

def getHtmlurl(url):
    try:
        r = requests.get(url)
        r.raise_for_status()  
        # 有效的判斷網絡連接的狀態。如果網連接出現錯誤,那么它就會用try-except來獲取一個異常。
        r.encoding = r.apparent_encoding  
        # 設置編碼格式為 從內容中分析出的相應內容編碼方式
        return r.text
    except:
        return "出現異常"

 

其中requests.get(url)得到的就是網頁代碼的全部內容,如下截圖:

 

 

  1. 在代碼中我們所要的就是圖片的網址

 

我們觀察這些代碼,發現圖片都在這里面

 

 

不過要注意,網站下拉最后一個不是圖片,而是下一頁的網址

 

 

所以我們在提取的時候要把這最后一個給過濾出去,觀察它們<a>標簽的不同,可以看出它們有一個顯著的區別,就是一個有target標簽,一個沒有

 

 

所以我們可以這樣過濾:

 

all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'target': '_blank'})

 

這里還有一個要過濾的,如下所示,他點開展示的是另外一組圖片

 

 

比較它們的區別,可以看到它們的href一個里面包括http,一個不包括,所以我們可以這樣過濾

 

soup = BeautifulSoup(html, 'html.parser')
all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'href': re.compile('^((?!http).)*$'),'target': '_blank'})

 

這樣我們就得到了我們想要的部分,不過事情沒有那么簡單,如果我們點開img標簽里的網址,我們得到的並不是一個高清大圖,於是我們繼續深入內里

進入<a>標簽中的網址,或者直接點擊圖片,然后我們研究一下跳轉后的頁面的源代碼

 

 

現在我們要得到這個img標簽里的網址,還是用我們的BeautifulSoup:

 

soup1 = 通過前一個網頁的a標簽里的地址得到這個跳轉后網頁的全部代碼
 im1 = soup1.find('div', id='main').find('div', class_='endpage').find('p').find('img')

 

從上面這代碼中,我們看出,我們需要通過上一個網頁中的a標簽來得到這個跳轉后的頁面的網址,從而通過BeautifulSoup得到這個頁面的全部內容,這里我定義了一個方法,傳入參數為上一個頁面<a>標簽里的內容

 

def getimgurl(img):
    href = img['href']
    # 這里我們需要拼一下串,因為a標簽里的網址不是完整的
    url = "http://www.netbian.com" + href
    htm = getHtmlurl(url)
    soup = BeautifulSoup(htm, 'html.parser')
    # htm 表示被解析的html格式的內容
    # html.parser表示解析用的解析器
    return soup

 

  1. 現在,我們已經離成功不遠了,我們得到了圖片的網址,現在只要下載下來保存到本地即可

 

 title = img['title']    
        root = 'D:/pictest/'
        # 這是你要保存圖片的位置
        t = title.split()
        # 將圖片title按空格分開,取第一個空格前的字符作為圖片名,這個你可以自己調整
        path = root + t[0] + '.jpg'
​
        try:
            if not os.path.exists(root):
                os.mkdir(root)
            if not os.path.exists(path):
                r = requests.get(img_url)
                with open(path, 'wb') as f:
                    f.write(r.content)
                    f.close()
                    print('文件保存成功')
            else:
                print('文件已存在')
        except Exception as e:
            print(str(e))
            print('爬取失敗')

 

這樣我們的入門級爬蟲就完成啦,根據個人愛好,你還可以進行壁紙的篩選,譬如我不要美女的壁紙,那我可以這樣做

       

if title.find(u"女") != -1:
            # 你可以自定義規則來篩選你想要的壁紙
            print("不符合要求,跳過")
            continue

 

聽完解釋后,再去看一遍源碼吧,相信你就有自己打出來的能力了!!!(其中的getNextpage方法的作用是得到下一頁的網址,相信你們自己已經可以看懂啦)

 

最終結果如下:

 

 

參考文章:https://blog.csdn.net/xuelucky/article/details/81217906

 


免責聲明!

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



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