爬取彼岸網站的桌布(分類可選)
建立時間: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)