要不是真的喜歡學(xué)技術(shù),誰會來爬小姐姐啊。

養(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ā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容