博主學習實戰視頻的參考教程:https://www.bilibili.com/video/av75562300?from=search&seid=10719635559175933725
視頻教的不多,但足以讓博主這種小白入門
下面是根據博主根據自己的理解通過python基礎進一步實現自己想要的內容
后續會補充通過python函數、python面對對象去實現。
未經作者授權,禁止轉載
一、環境
Python 3.7.3
requests庫
谷歌瀏覽器-開發者版
VS CODE
二 、爬一個小姐姐當前頁面圖片
1.確定好我們需要爬取的網頁
我選的是
網站首頁鏈接為:https://www.vmgirls.com/
有點多,做人還是不要太貪比較好,我就選清純少女好了

可以在瀏覽器地址欄拿到網址 : https://www.vmgirls.com/pure
2.獲取網站的文本
新建spider_girl.py 輸入以下代碼
import requests url = "https://www.vmgirls.com/pure"
# 請求網頁 response = requests.get(url=url)
# 查看獲取文本 print(response.text)

很明顯,告訴了我們被拒絕訪問了,這是因為headers的原因,也可以理解為反爬吧
這個時候我們的headers為
我們只需要根據需求把需要的修改一下就可以了,我就只修改了‘User-Agent’。可以從網站中獲取。在谷歌瀏覽器中,按F12,彈出的開發者工具

修改后的代碼如下:
1 import requests 2 url = "https://www.vmgirls.com/pure" 3 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 4 response = requests.get(url=url, headers=header) 5 print(response.text)
獲取成功,獲取的內容太多就不截圖了
接下來我們需要保存獲取的文本以便接下來的操作
html = response.text
3.獲取指定鏈接
我們先只獲取第一個小姐姐的照片
所以我們要先進入放置第一個小姐姐的照片的網站
右擊第一個小姐姐點擊檢查 彈出開發者工具顯示網頁元素

標題對應着小姐姐的照片網址,我們需要將獲取鏈接並保存
# 這是查詢網站中所有小姐姐的地址鏈接,但我們目前只需要第一個
# findall中括號的內容就是我們獲取的內容
import re
girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) print(girl_url[0])

可以看到,獲取的一模一樣,成功
4.獲取小姐姐的照片網站文本
girl_response = requests.get(url=girl_url[0], headers=header) print(girl_response.text)
跟上面獲取操作一致
5.獲取小姐姐的照片!
右擊小姐姐照片,點擊檢查

# <a>標簽很多,所以我們需要多一個alt屬性和title屬性確保只剩下我們需要的照片地址 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) print(pics) print(len(pics))
因為此頁總共就只有五張小姐姐的照片,所以我們將只會有五個鏈接。

很明顯,成功了。接下來就是保存五個小姐姐的照片了
6.保存小姐姐的圖片
# 獲取該網址的標題 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] # 為每一個小姐姐的照片放置好容身住處 img_file = r"./girl_img/%s" % title # 檢測是否存在,如果不存在則新建 if not os.path.exists(img_file): os.mkdir(img_file) for pic in pics: pic_name = pic.split('/')[-1] pic_res = requests.get(pic) with open("%s/%s" % (img_file, pic_name), "wb") as p: p.write(pic_res.content)
運行后就可以看到目錄中多了五張圖片,成功

目前源代碼如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 girl_response = requests.get(url=girl_url[0], headers=header) 10 girl_html = girl_response.text 11 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 12 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 13 img_file = r"./girl_img/%s" % title 14 img_name = "" 15 if not os.path.exists(img_file): 16 os.mkdir(img_file) 17 for pic in pics: 18 pic_name = pic.split('/')[-1] 19 print(pic_name) 20 pic_res = requests.get(pic) 21 print(pic_res.status_code) 22 with open("%s/%s" % (img_file, pic_name), "wb") as p: 23 p.write(pic_res.content)
三、爬蟲完成翻頁獲取
1.獲取目標網址
我們可以看到,小姐姐的照片是不止當前界面的,還有第二頁第三頁。我們手動進入網頁查看,地址欄的變化為 https://www.vmgirls.com/13506/page-2.html https://www.vmgirls.com/13506/page-3.html.....
所以我們需要把之前獲取的網址的結尾修改成我們需要的來完成翻頁操作繼續獲取
# 分頁存在着多個的可能性,所以我們需要一個循環來獲取所有分頁圖片 # 設置一個變量n,來獲取每次循環的分頁頁碼 n = 1 while n != 0: # 因為分頁都是第二頁起,所以先自加1 n += 1 # 修改網址為分頁的網址格式,同時將變量n加入其中 girl_url_more = girl_url[0].replace(".html", "/page-%d.html" % n) girl_response = requests.get(url=girl_url_more, headers=header) # 打印網址確定跟我們想要得到的是一致,同時打印響應碼來確定該網址是否成功響應 print(girl_url_more) print(girl_response.status.code)

我們可以看到在第七頁時,出現了404,所以我們可以確定2-6頁都是存在的且都為200,所以我們在循環中加入一個判斷條件
# 當網址響應失敗時,將變量n設置為0結束循環 if girl_response.status_code != 200: n = 0
2.重復之前獲取圖片操作
pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) for pic in pics: pic_name = pic.split('/')[-1] pic_res = requests.get(pic) with open("%s/%s" % (img_file, pic_name), "wb") as p: p.write(pic_res.content)
結果就是我們的文件夾多了好多好多張圖片了!

目前源代碼如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 girl_response = requests.get(url=girl_url[0], headers=header) 10 girl_html = girl_response.text 11 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 12 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 13 img_file = r"./girl_img/%s" % title 14 img_name = "" 15 if not os.path.exists(img_file): 16 os.mkdir(img_file) 17 for pic in pics: 18 pic_name = pic.split('/')[-1] 19 print(pic_name) 20 pic_res = requests.get(pic) 21 print(pic_res.status_code) 22 with open("%s/%s" % (img_file, pic_name), "wb") as p: 23 p.write(pic_res.content) 24 n = 1 25 while n != 0: 26 n += 1 27 girl_url_more = girl_url[0].replace(".html", "/page-%d.html" % n) 28 girl_response = requests.get(url=girl_url_more, headers=header) 29 if girl_response.status_code != 200: 30 n = 0 31 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) 32 for pic in pics: 33 pic_name = pic.split('/')[-1] 34 pic_res = requests.get(pic) 35 with open("%s/%s" % (img_file, pic_name), "wb") as p: 36 p.write(pic_res.content)
三、爬取八個的小姐姐圖片
步驟基本屎一樣的,我就不123標注了。
前面8個小姐姐其實早已經安排好了。在girl_url里。我們因為前面只用一個,所以在第九行的girl_url后加了個[0]
我們只要用for循環遍歷出鏈接即可,但獲取數目過多,我們需要在過程中補充一些print來確定當前進度,以便中途出現問題我們確切知道問題在哪一個環節上
目前源代碼如下:
1 import requests 2 import re 3 import os 4 url = "https://www.vmgirls.com/pure" 5 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3983.2 Safari/537.36"} 6 response = requests.get(url=url, headers=header) 7 html = response.text 8 girl_url = re.findall('<a href="(.*?)" class="list-title text-md h-2x" target="_blank">', html) 9 for item_url in girl_url: 10 girl_response = requests.get(url=item_url, headers=header) 11 girl_html = girl_response.text 12 title = re.findall('<h1 class="post-title h3">(.*?)</h1>', girl_html)[-1] 13 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_html) 14 img_file = r"./girl_img/%s" % title 15 img_name = "" 16 if not os.path.exists(img_file): 17 os.mkdir(img_file) 18 num = 0 19 img_id = 0 20 print("-" * 20) 21 print("正在獲取'%s'的照片" % title) 22 for pic in pics: 23 img_id += 1 24 pic_name = pic.split('/')[-1] 25 pic_res = requests.get(pic) 26 print("正在下載第%d張照片" % img_id) 27 with open("%s/%s" % (img_file, pic_name), "wb") as p: 28 p.write(pic_res.content) 29 print("下載成功") 30 n = 1 31 while n != 0: 32 n += 1 33 girl_url_more = item_url.replace(".html", "/page-%d.html" % n) 34 girl_response = requests.get(url=girl_url_more, headers=header) 35 if girl_response.status_code != 200: 36 n = 0 37 pics = re.findall('<a href="(.*?)" alt=".*?" title=".*?" .*?>', girl_response.text) 38 for pic in pics: 39 pic_name = pic.split('/')[-1] 40 pic_res = requests.get(pic) 41 img_id += 1 42 print("正在下載第%d張照片" % img_id) 43 with open("%s/%s" % (img_file, pic_name), "wb") as p: 44 p.write(pic_res.content) 45 print("下載成功") 46 47 print("-" * 20)
進度報告部分截圖:

最終結果:

成功!!
