python爬蟲-vmgirls-正則表達式


概述

本次爬蟲任務是爬取圖片網站圖片,網址是https://www.vmgirls.com/

 


分析網頁

第一步,打開需要爬取的頁面https://www.vmgirls.com/13344.html

打開F12,隨便選擇一張圖片查看圖片,操作如下

 

 

 第二步,尋找所需下載圖片的地址,並分析最優的方式

 

 

 第三步,得出結論,可以通過獲取每張圖片的url地址,進行保存圖片的動作


代碼操作

請求網頁

第一步,我們請求網頁並打印網頁返回的請求

import requests
'''請求網頁'''
response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#請求網址並得到一個回復
print(response.text)

發現出現403 Forbidden,我們需要尋找原因

# <html>
# <head><title>403 Forbidden</title></head>
# <body>
# <center><h1>403 Forbidden</h1></center>
# <hr><center>Her</center>
# </body>
# </html>

我們插入一個代碼

print(response.request.headers)

發現問題所在,網頁返回的信息中表示,我們發送的請求來源於一個爬蟲程序,所以我們需要偽裝一個header,

# {'User-Agent': 'python-requests/2.23.0',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept': '*/*',
# 'Connection': 'keep-alive'}

怎么做,打開瀏覽器,指定網頁,F12查看瀏覽器發送的headers

 

 復制heades到代碼中

import requests
'''請求網頁'''
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}

response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#請求網址並得到一個回復
print(response.text)
print(response.request.headers)

能夠正常得到網頁返回的信息了


 

 解析網頁

解析網頁本次使用正則表達式

導入re庫

import re

urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
print(urls)

得到5個圖片的url鏈接

['https://static.vmgirls.com/image/2019/12/2019122210292813-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210295639-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210300913-scaled.jpeg',

'https://static.vmgirls.com/image/2019/12/2019122210301954-scaled.jpeg']


 

保存圖片

將所有的圖片保存為文件格式

for url in urls:
    response = requests.get(url, headers=headers)
    # 將url中后面的數字字段截取出來作為圖片的文件名
    file_name = url.split('/')[-1]
    # 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
    with open(file_name,'wb') as f:
    # 文件寫入每一個response返回的內容,最終保存的即為圖片,圖片地址在該py文件相同目錄
        f.write(response.content)

此時需要考慮到兩個問題

1.訪問頻次

2.文件應該需要保存在但個文件夾中,問不是散亂的存放

修改代碼如下

import os
#
獲得文件夾名 dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1] # 判斷文件夾是否存在,並創建文件夾 if not os.path.exists(dir_name): os.makedirs(dir_name) # 遍歷所有的url,將所有的url單獨保存 for url in urls: # 放置訪問頻次太高,設置訪問頻率,需要導入time模塊 time.sleep(1) response = requests.get(url, headers=headers) # 將url中后面的數字字段截取出來作為圖片的文件名 file_name = url.split('/')[-1] # 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。 # 由於加入了文件夾的步驟,所以with open(file_path,wb)as f中file_path需要帶上文件夾 # with open(file_name,'wb') as f: with open(dir_name+'/'+file_name, 'wb') as f: # 文件寫入每一個response返回的內容,最終保存的即為圖片,圖片地址在該py文件相同目錄 f.write(response.content) # 由於這種方式文件是一個個單獨的存放在目錄下面,並沒有較好的分類,我們需要加入一個分類的步驟 # 根據網頁中的名稱設置文件夾名為dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1] # 若想創建文件夾,需要導入os庫 # 判斷文件夾是否存在

任務完成

完整代碼

import requests
import re
import time
import os

'''請求網頁'''

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}

response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#請求網址並得到一個回復
html = response.text

"""
print(response.text)

# <html>
# <head><title>403 Forbidden</title></head>
# <body>
# <center><h1>403 Forbidden</h1></center>
# <hr><center>Her</center>
# </body>
# </html>

# 發現了403 Forbidden,也就是這個系統設置了反爬蟲,所以需要改變
# 我們查看一下返回的headers,也就是請求的頭信息

print(response.request.headers)

# {'User-Agent': 'python-requests/2.23.0',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept': '*/*',
# 'Connection': 'keep-alive'}

# 發現這是用python端請求,理所當然的被網頁拒絕了,所以我們需要一個偽裝的headers,偽裝成瀏覽器發送的請求
# 怎么做,打開瀏覽器,指定網頁,F12查看瀏覽器發送的headers
# {user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36}

# 制作偽裝的headers
# headers = {'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
# 注意headers是一個字典,不是字符串,所以格式為"user-agent":"頭部具體信息"

# 將headers放置到網頁請求的前面,即response前
# 同時response里面帶上headers
# 程序運行之后發現可以正常運行

"""

'''解析網頁'''

# 解析網頁本次使用正則表達式
# 導入re庫


# 獲得文件夾名
dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
# 判斷文件夾是否存在,並創建文件夾
if not  os.path.exists(dir_name):
    os.makedirs(dir_name)


# 獲得所有圖片的url鏈接
urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
print(urls)



"""保存圖片"""


# 遍歷所有的url,將所有的url單獨保存
for url in urls:

    # 放置訪問頻次太高,設置訪問頻率,需要導入time模塊
    time.sleep(1)
    response = requests.get(url, headers=headers)
    # 將url中后面的數字字段截取出來作為圖片的文件名
    file_name = url.split('/')[-1]

    # 以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
    # 由於加入了文件夾的步驟,所以with open(file_path,wb)as f中file_path需要帶上文件夾
    # with open(file_name,'wb') as f:
    with open(dir_name+'/'+file_name, 'wb') as f:
        # 文件寫入每一個response返回的內容,最終保存的即為圖片,圖片地址在該py文件相同目錄
        f.write(response.content)

# 由於這種方式文件是一個個單獨的存放在目錄下面,並沒有較好的分類,我們需要加入一個分類的步驟
# 根據網頁中的名稱設置文件夾名為dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
# 若想創建文件夾,需要導入os庫
# 判斷文件夾是否存在

圖片結果

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM