爬取彼岸網站的桌布(分類可選)

随风小屋發表於2024-07-03

爬取彼岸網站的桌布(分類可選)

建立時間:2024年2月28號

背景

在一個偶然的機會,我在某個網站上發現了一個專門爬取美女圖片的爬蟲程式,這立刻激發了我的興趣。我決定將其下載下來,進行深入的學習和研究。在理解並掌握了其基本原理和技術後,我根據自己的程式設計習慣和審美標準,對其進行了調整和最佳化。這個程式不僅涉及到了XPath的使用,讓我能夠更精確地定位和提取網頁中的圖片元素,還讓我實踐了基本的爬蟲技術,鍛鍊了我的資料處理能力。同時,透過運用os模組建立資料夾和檢測資料夾是否存在,我實現了對下載圖片的有效管理和組織。

效果:

相關學習資料:

xpath學習網站(10分鐘即可學完):   https://www.runoob.com/xpath/xpath-tutorial.html

完整程式碼

"""
地址:http://www.netbian.com/
在網站上選擇自己喜歡的分類,然後將名字天填到下面的 classify 後面。
後面還可以選擇開始的頁數和需要爬取的頁數start_page 和end_page  
"""
import os

#  匯入 requests 和 etree 模組
import requests
from lxml import etree

classify = "meinv" # 修改分類----在此
start_page = 1
end_page = 3


# 確保 "wallpaper" 資料夾存在,
folder_path = f"./wallpaper/{classify}"
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

#  迴圈下載n頁的圖片
for i in range(start_page-1, end_page):
    url = f"http://www.netbian.com/{classify}/"  # 網站上分類的url地址
    #  第一頁的地址和後面頁的地址不同,需要分別處理
    if i == 0:
        url = url + "index.htm"
        i += 1
    else:
        url = url + "index_" + str(i + 1) + ".htm"

    #  設定協議頭
    headesp = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35'}

    #  傳送get請求並獲取響應且設定編碼
    resp = requests.get(url, headers=headesp)
    resp.encoding = resp.apparent_encoding

    #  將響應內容解析為etree物件
    xp = etree.HTML(resp.text)

    #  獲取每頁中的圖片詳情頁連結
    img_url = xp.xpath("/html/body/div[@class='wrap clearfix']/div[@id='main']/div[@class='list']/ul/li/a/@href")
    print(img_url)
    for n in img_url:
        #  根據圖片詳情頁連結再次傳送get請求並獲取圖片地址和名稱
        resp = requests.get('http://www.netbian.com' + n)
        resp.encoding = resp.apparent_encoding
        xp = etree.HTML(resp.text)
        img_urls = xp.xpath('//div[@class="pic"]/p/a/img/@src')
        img_name = xp.xpath('//div[@class="pic"]/p/a/img/@alt')

        # 下載並儲存到目標資料夾
        for u, n in zip(img_urls, img_name):
            print(f'圖片名:{n} 地址:{u}')
            img_resp = requests.get(u)
            with open(f'./{folder_path}/{n}.jpg', 'wb') as f:
                f.write(img_resp.content)

下面是程式碼的一步步拆分

0.定義需要的變數

classify = "meinv" # 需要抓取的分類名稱
start_page = 1 # 開始頁碼
end_page = 3 # 結束頁碼

1.先建立資料夾是否存在,不存在則建立

# 確保 "wallpaper" 資料夾存在,
folder_path = f"./wallpaper/{classify}"
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

2.獲取每頁中的圖片詳情頁連結

#  迴圈下載n頁的圖片
for i in range(start_page-1, end_page):
    url = f"http://www.netbian.com/{classify}/"  # 網站上分類的url地址
    #  第一頁的地址和後面頁的地址不同,需要分別處理
    if i == 0:
        url = url + "index.htm" # http://www.netbian.com/meinv/index.htm 或者  http://www.netbian.com/meinv/
        i += 1
    else:
        url = url + "index_" + str(i + 1) + ".htm" # http://www.netbian.com/meinv/index_2.htm

    #  設定協議頭
    headesp = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35'}

    #  傳送get請求並獲取響應且設定編碼
    resp = requests.get(url, headers=headesp)
    resp.encoding = resp.apparent_encoding # 將響應的編碼方式設定檢測到的編碼方式,不一定100%正確,其他爬蟲不對自己除錯

    #  將響應內容解析為etree物件 方便使用xpath進行分析
    xp = etree.HTML(resp.text)  # 將resp.text中的內容解析為一個ElementTree物件,這個物件表示了HTML文件的結構,並允許使用XPath或其他方法來查詢和操作文件中的元素。
    #  獲取每頁中的圖片詳情頁連結
    img_url = xp.xpath("/html/body/div[@class='wrap clearfix']/div[@id='main']/div[@class='list']/ul/li/a/@href") # xpath表示式。。。
    # print(img_url)

3.根據圖片詳情頁連結再次傳送get請求並獲取圖片地址和名稱

  for n in img_url:
        #  根據圖片詳情頁連結再次傳送get請求並獲取圖片地址和名稱
        resp = requests.get('http://www.netbian.com' + n)
        resp.encoding = resp.apparent_encoding
        xp = etree.HTML(resp.text)
        img_urls = xp.xpath('//div[@class="pic"]/p/a/img/@src')
        img_name = xp.xpath('//div[@class="pic"]/p/a/img/@alt')

4.下載並儲存到目標資料夾

      for u, n in zip(img_urls, img_name):
            print(f'圖片名:{n} 地址:{u}')
            img_resp = requests.get(u)
            with open(f'./{folder_path}/{n}.jpg', 'wb') as f:
                f.write(img_resp.content)

ps:xpath分析

執行結果:


5.該專案的程式碼和下載好的一些圖片地址

連結:https://pan.baidu.com/s/1xruRPcFm6t8k8bkGxYfe3w?pwd=9m5b 
提取碼:9m5b 
--來自百度網盤超級會員V6的分享

總結

該專案旨在專門抓取位於 {http://www.netbian.com/{classify}/} 路徑下的圖片。考慮到網站上可能還存在其他形式的圖片,這些將不作為處理物件。在執行爬蟲任務時,若遇到抓取某張圖片時出現問題,程式將自動跳過該圖片(本程式未做),並將出錯的相關資訊列印出來,以便後續進行處理。透過這種方式,我們的爬蟲能夠更加精準地定位並獲取目標圖片,同時保證在遇到問題時仍能繼續執行,提高爬蟲的魯棒性和效率。

悄悄告訴你:下面還有一個簡單一點的

"""
地址:http://www.netbian.com/

"""
import os

#  匯入 requests 和 etree 模組
import requests
from lxml import etree

classify = "keai"
start_page = 1
end_page = 2


# 確保 "wallpaper" 資料夾存在,
folder_path = f"./wallpaper/{classify}"
if not os.path.exists(folder_path):
    os.makedirs(folder_path)


#  迴圈下載n頁的圖片
for i in range(start_page-1, end_page):
    url = f"http://www.netbian.com/{classify}/"  # 網站上分類的url地址
    #  第一頁的地址和後面頁的地址不同,需要分別處理
    if i == 0:
        url = url + "index.htm"
        i += 1
    else:
        url = url + "index_" + str(i + 1) + ".htm"

    #  設定協議頭
    headesp = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35'}

    #  傳送get請求並獲取響應且設定編碼
    resp = requests.get(url, headers=headesp)
    resp.encoding = resp.apparent_encoding

    #  將響應內容解析為etree物件
    xp = etree.HTML(resp.text)

    #  獲取每頁中的圖片詳情頁連結
    img_urls = xp.xpath("/html/body/div[@class='wrap clearfix']/div[@id='main']/div[@class='list']/ul/li/a/img/@src")
    img_names = xp.xpath("/html/body/div[@class='wrap clearfix']/div[@id='main']/div[@class='list']/ul/li/a/img/@alt")
    for url,name in zip(img_urls,img_names):
        print(f'圖片名:{name}  圖片地址:{url}')
        img_response = requests.get(url)
        with open(f'./{folder_path}/{name}.jpg', 'wb') as f:
            f.write(img_response.content)

相關文章