渣男,你為什麼有這麼多小姐姐的照片?因為我Python爬蟲學的好啊️!

盼小輝丶 2021-08-15 22:55:21 阅读数:670

本文一共[544]字,预计阅读时长:1分钟~
小姐 姐姐 照片 python 好啊

渣男,你為什麼有這麼多小姐姐的照片?因為我Python爬蟲學的好啊️!

前言

大家心心念的三次元來了,又又到了無中生友的環節了,自從上次出了突破次元壁障,Python爬蟲獲取二次元女友後,很多朋友都在評論說想要一期三次元小姐姐的爬蟲教程,這個問題就來了,雖然三次元小姐姐的圖片網站有很多,但是本著學習交流的目的,要找一個尺度合適的就太難了,但是我沒有放弃,經過了夜以繼日的長時間不懈努力,終於為大家找到了一個適合學習研究爬蟲技術的治愈系圖庫分享網站,這從每篇圖册的名字就可以看出來,例如《你依舊是你》、《你的美好適逢其時》、《時光都走慢了》等等就可以看出來了,如果你還是不相信,我只能將網頁展示一下了。

網頁展示

怎麼樣,沒騙人吧?都是治愈系的小姐姐。

程序說明

通過爬取小姐姐圖庫分享網站——mmkk.me,獲取高清小姐姐照片,使用庫包括:requestsBeautifulSoup

爬蟲程序

有很多小夥伴可能會想都是爬圖片,那和突破次元壁障,Python爬蟲獲取二次元女友中介紹的方法有什麼區別呢,直接換下網址,解析不同的元素不就可以了?如果真的只是這樣,那我直接給出網站不就可以了(雖然可能很多小夥伴的真實目的就只需要這個),但如果你也是這麼想的,那你就想的太簡單了。

觀察網頁結構

在網頁結構這裏我們就能看到第一個區別,就是此網站的加載方式,是頁面滾動動態加載數據,也就是說下拉滾動條或鼠標滾輪滾動到頁面底部時才會動態即時加載下一頁新內容,這就需要我們認真觀察網絡選項卡中頁面動態加載時的變化了。
經過觀察,可以看到每次加載新的圖册時,都會顯示有數字標記的頁面請求,點擊查看詳情,可以看到新的頁面請求,如下圖所示:
頁面滾動動態加載數據
因此如果想要獲取前10頁的圖册,可以采用如下方式構造請求頁:

url_pattern = "https://www.mmkk.me/category/weimei/{}/"
for i in range(1,11):
url = url_pattern.format(i)

頁面解析

第二個區別就是,此網站中的數據是直接鑲嵌在頁面元素中的,也就是說可以直接通過使用 BeautifulSoup 解析獲取。
首先需要獲取圖册的地址,使用瀏覽器“開發者工具”,定比特圖册鏈接:

獲取圖册地址

因此,例如要獲取第一頁中所有圖册地址,可以使用如下方式:

url = url_pattern.format(1)
response = requests.get(url=url, headers=headers)
# 解碼
response.encoding = 'utf-8'
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
results = soup.find_all('a',attrs={
"class":"item-link"})
# 打印查看獲取的圖册鏈接
for j in results:
print(j.attrs['href'])
# 為了對每個圖册分別存儲,獲取每個圖册的標題信息
path_name=j.get_text().strip()

打印查看獲取的圖册鏈接:

https://www.mmkk.me/weimei/5537.html
https://www.mmkk.me/weimei/5438.html
https://www.mmkk.me/weimei/5991.html
https://www.mmkk.me/weimei/6278.html
https://www.mmkk.me/weimei/5827.html

獲取圖册地址後,就可以請求圖册頁面,然後在圖册中解析獲取每張圖片的地址(方法與解析圖册地址類似):

獲取圖片地址
例如要獲取第一個圖册中所有的圖片地址:

url_imgs = results[0].attrs['href']
response_imgs = requests.get(url=url_imgs, headers=headers)
# 解碼
response_imgs.encoding = 'utf-8'
response_imgs.raise_for_status()
soup_imgs = BeautifulSoup(response_imgs.text, 'html.parser')
results_imgs = soup_imgs.find_all('div',attrs={
"data-fancybox":"gallery"})
# 打印查看獲取的圖片地址
for k in range(len(results_imgs)):
print(results_imgs[k].attrs['data-src'])

打印查看獲取的圖片地址鏈接:

https://imgs.mmkk.me/wmnv/img/20190625081910-5d11d8fe5422b.png
https://imgs.mmkk.me/wmnv/img/20190625081910-5d11d8feae474.png
https://imgs.mmkk.me/wmnv/img/20190625081911-5d11d8ff282b1.png
...

創建圖片保存路徑

根據在頁面解析中獲取到圖册名,創建保存路徑:

if not os.path.exists(path_name):
os.makedirs(path_name, exist_ok=True)

圖片下載

首先利用獲取的圖册名以及圖片順序,構建保存的圖片名:

file_name = path_name +'_'+str(k+1)+'.png'
file_name = os.path.join(path_name, name_webp)

然後將獲取的圖片內容寫入文件中:

# 以第一張圖片為例
r = requests.get(results_imgs[0].attrs['data-src'], headers=headers)
if r.status_code == 200:
with open(file_name, 'wb') as f:
f.write(r.content)

爬取結果展示

接下來看下爬取程序結果:

爬取結果

完整程序

import time
import requests
from bs4 import BeautifulSoup
import os
import random
url_pattern = "https://www.mmkk.me/category/weimei/{}/"
headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62',
'Connection': 'keep-alive'
}
# 爬取前5頁
for i in range(1, 6):
time.sleep(10)
url = url_pattern.format(i)
response = requests.get(url=url, headers=headers)
# 解碼
response.encoding = 'utf-8'
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# 相册鏈接
results = soup.find_all('a',attrs={
"class":"item-link"})
# 循環所有相册鏈接
for j in results:
time.sleep(random.randint(8,13))
url_imgs = j.attrs['href']
# 相册名
path_name = j.get_text().strip()
# 創建圖片保存路徑
if not os.path.exists(path_name):
os.makedirs(path_name, exist_ok=True)
response_imgs = requests.get(url=url_imgs, headers=headers)
# 解碼
response_imgs.encoding = 'utf-8'
response_imgs.raise_for_status()
soup_imgs = BeautifulSoup(response_imgs.text, 'html.parser')
# 圖片鏈接
results_imgs = soup_imgs.find_all('div',attrs={
"data-fancybox":"gallery"})
# 循環所有圖片鏈接
for k in range(len(results_imgs)):
img = results_imgs[k].attrs['data-src']
file_name = path_name + '_' + str(k+1) + '.png'
file_name = os.path.join(path_name, file_name)
if not os.path.exists(file_name):
time.sleep(random.randint(3,8))
r = requests.get(img, headers=headers)
if r.status_code == 200:
with open(file_name, 'wb') as f:
f.write(r.content)

最後

當然網站中也包含其他分類的圖册,但是我並沒有點開,畢竟大家都喜歡治愈唯美系的小姐姐,如果有小夥伴對其他分類感興趣,也可以自行修改程序.
為了給大家謀取更多福利,博主都被罵成渣男了,求求各比特給個三連,不過分吧?

版权声明:本文为[盼小輝丶]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815225504104t.html