概述
本次爬蟲任務是爬取圖片網站圖片,網址是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庫 # 判斷文件夾是否存在
圖片結果