養(yǎng)成習(xí)慣,先贊后看?。?!
不用于任何商業(yè)價值,只是自己娛樂。
否則 爬蟲爬的好,牢飯吃到飽。
這是我們這次爬取的網(wǎng)址:https://www.vmgirls.com/
1.準(zhǔn)備工作
這次我們主要運(yùn)用四個模塊分別是
BeautifulSoup:主要用于我們來分析網(wǎng)頁信息
requests:主要是用于我們來請求網(wǎng)頁
re:正則表達(dá)式,幫組我們來匹配實際需要的信息
os:主要負(fù)責(zé)幫我們下載圖片
2.分析網(wǎng)頁+實際操作
一開始我們先分析單個頁面進(jìn)行爬取下載,之后我們在分析首頁獲取到所有頁面的鏈接,最后對我們之前的代碼進(jìn)行整合規(guī)范化。
2.1分析頁面1
頁面網(wǎng)址:https://www.vmgirls.com/9384.html

我們通過鼠標(biāo)定位到我們需要爬取的圖片的信息就在上圖紅色方框中,并且通過觀察頁面的格式我們發(fā)現(xiàn)大體格式基本一樣,基本都是下面這種樣式:
<img alt="酸酸的,甜甜的-唯美女生" width="2904" height="4356"
class="alignnone size-full loaded"
data-src="image/2018/08/2018-08-10_13-52-47.jpg"
data-nclazyload="true" data-pagespeed-url-hash="1859759222"
onload="pagespeed.CriticalImages.checkImageForCriticality(this);"
data-pagespeed-lsc-url="https://www.vmgirls.com/image/2018/08/2018-08-10_13-52-47.jpg"
src="image/2018/08/2018-08-10_13-52-47.jpg" data-was-processed="true">
并且通過分析我們可以得到圖片的鏈接其實就在img的data-pagespeed-lsc-url屬性之中,那么我們就來嘗試先將所有的img空間爬取下來
import requests
from bs4 import BeautifulSoup
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
response=requests.get('https://www.vmgirls.com/9384.html',headers=headers)
html=response.text
"""解析網(wǎng)頁"""
findImgsrc=re.compile(r'data-src="(.*?)"')
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all("img", class_="alignnone size-full"):
print(item)

但是當(dāng)我們爬取下來之后發(fā)現(xiàn)img控件中并沒有data-pagespeed-lsc-url這個屬性,那么我們怎么辦呢?別急繼續(xù)看我們發(fā)現(xiàn)雖然沒有data-pagespeed-lsc-url但是data-src屬性和data-pagespeed-lsc-url也差不多,只是缺少了部分請求頭,這個我們完全可以通過后續(xù)的字符串操作進(jìn)行修改得到,所以我們編寫正則表達(dá)式進(jìn)行匹配獲取到我們需要的信息
findImgsrc=re.compile(r'data-src="(.*?)"')
就這簡單一句就行了,獲取到了還不行,因為他還不符合我們圖片鏈接的規(guī)范,所以我們還需要對該字符進(jìn)行處理。
datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/"+link[0:38])
這樣我們便能夠獲取到該頁面所有的圖片鏈接了

獲取到圖片鏈接之后我們就需要來下載圖片,這里我們主要運(yùn)用的就是os模塊
"""創(chuàng)建文件夾名稱"""
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print(dir_name)
"""保存圖片"""
for data in datas:
# 圖片名稱
time.sleep(0.5)
file_name=data.split("/")[-1]
response=requests.get(data,headers=headers)
with open(dir_name+'/'+file_name,'wb') as f:
f.write(response.content)
print(file_name+"下載成功")
到此我們的第一個頁面就分析結(jié)束了
2.2分析頁面2
頁面網(wǎng)址:https://www.vmgirls.com/12985.html
按道理其實每個頁面的布局以及設(shè)計基本上都應(yīng)該是一樣的,但是這個網(wǎng)站有點(diǎn)奇怪。他的頁面之間有一些不同像下面這個:

可能乍看上去大家覺得可能是一樣的,但是通過對比圖大家就能看出來了

我選擇的另一種方式就是直接通過他的a標(biāo)簽來獲取圖片的鏈接,我們分析它的a標(biāo)簽的結(jié)構(gòu),設(shè)計下面的正則表達(dá)式來進(jìn)行匹配:
re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html)
接下來我們爬取看看是不是我們需要的
for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html):
print(item)

顯然爬出來的和上述的情況一樣,我們還需要為他添加請求頭
for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html):
print("https://www.vmgirls.com/" + item)
這樣我們再看看如何

這樣就已經(jīng)變成鏈接了。
到這里第二個頁面我們也已經(jīng)分析完畢了。
2.3分析首頁
如果只是單個頁面的爬取,顯然還是不能滿足博主,畢竟只有一個小姐姐。博主我選擇

那么既然這樣我們就需要來分析首頁的網(wǎng)頁結(jié)構(gòu),但是看完首頁的網(wǎng)頁結(jié)構(gòu),我們發(fā)現(xiàn)

他整個頁面上并不存在任何分頁的控件,所以像之前豆瓣那樣的爬取是不行了,接著我們看

這里不就是我們需要的鏈接,所以我們可以分析整個網(wǎng)頁,將他所有的鏈接全部保存下來,之后我們再去一個一個訪問不就行了
"""解析網(wǎng)頁獲取到所有頁面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
//判斷是否含有元素
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
//重新構(gòu)造成我們需要的網(wǎng)頁鏈接
newlink="https://www.vmgirls.com/" + link
//并且進(jìn)行去重操作
if newlink not in datas:
datas.append(newlink)
之后我們來看結(jié)果

這樣我們就爬取到了頁面上的所有網(wǎng)址鏈接了。
2.4整合代碼,準(zhǔn)備起飛
上面的準(zhǔn)備工作已經(jīng)全部完成了,接下來我們就將各個模塊的代碼進(jìn)行封裝,方便我們調(diào)用,并且使代碼更加的規(guī)范化。
8月13日更新一次代碼,由于之前的請求頭模擬的不夠徹底,導(dǎo)致網(wǎng)站認(rèn)定我們是爬蟲,下載能下載,但是會出現(xiàn)圖片打不開的情況,所以添加了部分請求頭的信息
8月25日更新一次代碼,原因還是上面的原因,這次主要是針對請求頭中的COOKIE數(shù)據(jù),建議做好復(fù)制瀏覽器中自己的cookie,并且主要是針對下載文件時請求網(wǎng)頁的請求頭
整體流程;
1.獲取首頁的所有頁面鏈接
"""解析網(wǎng)頁獲取到所有頁面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
newlink="https://www.vmgirls.com/" + link
if newlink not in datas:
datas.append(newlink)
# print(datas)
return datas
2.循環(huán)爬取各個頁面的圖片鏈接
"""解析網(wǎng)頁獲取到該頁面的所有圖片鏈接"""
def getdata(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
# print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/" + link[0:38])
for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html):
# print(item)
datas.append("https://www.vmgirls.com/" + item)
# print(datas)
return datas
3.根據(jù)鏈接創(chuàng)建相應(yīng)的文件夾
"""創(chuàng)建文件夾名稱"""
def createdir(html):
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
return dir_name
4.在相應(yīng)的文件夾中下載圖片
"""保存圖片"""
def download(datas,dir_name):
for data in datas:
time.sleep(0.25)
file_name=data.split("/")[-1]
response=requests.get(data,headers=headers)
with open(dir_name+'/'+file_name,'wb') as f:
f.write(response.content)
print(file_name+"下載成功")
修改后的完整代碼:
import time
import requests
import re
from bs4 import BeautifulSoup
import os
findImgsrc=re.compile(r'data-src="(.*?)"')
findLink=re.compile(r'href="(.*?)"')
headers={
"cookie": "_ga=GA1.2.1285440638.1596454858; verynginx_sign_javascript=9afce94d2a1677e47daf110997b372be; _gid=GA1.2.2085095474.1597149513; xcat_sign_cookie=2bf90ba8c55955f8cb9db86e256cf3f6; Hm_lvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597149513,1597193455,1597218065,1597295111; _GPSLSC=; Hm_lpvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597308777",
"if-none-match": 'W/"5dff458a-212202"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
headers2={
"cookie": "_ga=GA1.2.1285440638.1596454858; verynginx_sign_javascript=9afce94d2a1677e47daf110997b372be; xcat_sign_cookie=cfd666fa7ecf4e4a515ba54ea928d4b9; Hm_lvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1597218065,1597295111,1597374224,1598267245; _gid=GA1.2.1757491204.1598267245; _GPSLSC=; Hm_lpvt_a5eba7a40c339f057e1c5b5ac4ab4cc9=1598267370",
"if-none-match": 'W/"5dff458a-212202"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36",}
def main():
print("主程序入口")
urls = getlink(askURL('https://www.vmgirls.com/'))
# print(urls)
for url in urls:
html = askURL(url)
dir_name = createdir(html)
print("開始爬取" + dir_name)
data = getdata(html)
# print(data)
download(data, dir_name)
print(dir_name + "已經(jīng)下載完畢")
"""請求網(wǎng)頁信息"""
def askURL(url):
response=requests.get(url,headers=headers)
html=response.text
return html
# print(html)
"""解析網(wǎng)頁獲取到該頁面的所有圖片鏈接"""
def getdata(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("img", class_="alignnone size-full"):
# print(item)
item = str(item)
link = re.findall(findImgsrc, item)[0]
datas.append("https://www.vmgirls.com/" + link[0:38])
for item in re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html):
# print(item)
datas.append("https://www.vmgirls.com/" + item)
# print(datas)
return datas
"""解析網(wǎng)頁獲取到所有頁面的URL"""
def getlink(html):
soup = BeautifulSoup(html, "html.parser")
datas = []
for item in soup.find_all("a", class_="media-content"):
item = str(item)
if len(re.findall(findLink, item))!=0:
link = re.findall(findLink, item)[0]
newlink="https://www.vmgirls.com/" + link
if newlink not in datas:
datas.append(newlink)
# print(datas)
return datas
"""創(chuàng)建文件夾名稱"""
def createdir(html):
dir_name=re.findall('<h1 class="post-title h3">(.*?)</h1>',html)[0]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
return dir_name
"""保存圖片"""
def download(datas,dir_name):
for data in datas:
time.sleep(1)
file_name=data.split("/")[-1]
# print(data)
response=requests.get(data,headers=headers2)
with open(dir_name+'/'+file_name,'wb') as f:
f.write(response.content)
print(file_name+"下載成功")
if __name__ == '__main__':
main()
# init_db("movietest.db")
print("爬取完畢")
3.效果展示

都看到這里了,如果覺得對你有幫助的話,可以關(guān)注博主的公眾號,新人up需要你的支持。
如果有什么疑問或者想要源碼的話,可以私聊博主哦。

本文由博客群發(fā)一文多發(fā)等運(yùn)營工具平臺 OpenWrite 發(fā)布