python批量爬取圖片並保存在本地文件夾下
本人目前是山西農業大學軟件學院大三的一名學生,由於疫情嚴重,積極響應黨和國家的號召宅在家中,今日閒來無事,就對學院的官網下手啦,將官網上介紹學院的老師的照片全部爬取下來,留作畢業後自己慢慢懷念吧,話不多說,進入正題,開搞!
- 導入的包
我們一共需要使用到四個包
time包,用來設置間隔時間,防止把網頁爬崩(要是真的爬崩了我估計要倒大黴嘍)
requess包,當然是用來獲取網頁的源代碼和處理相應的啦
BeautifulSoup包,用來對網頁內容進行準確的抓取,具體的使用方法以後我會寫道
os包,文件處理最重要最常用的包,用來創建文件名等
import time
import requests
from bs4 import BeautifulSoup
import os
2.抓取網頁的源代
啥也不用說,直接上代碼,增加了容錯的機制,很好理解的,一看就懂
#封裝方法用來爬取網頁的源代碼
def getHTML(url):
try:
r = requests.get(url,timeout = 30,headers = hd)
r.raise_for_status() #容錯機制,若請求訪問失敗則返回的不是200,則返回字符串空
r.encoding = r.apparent_encoding #設置編碼方式,用解析返回網頁源碼得出的編碼方式代替 UTF-8
return r.text
except:
return ''
其中需要說明的就是更改requests請求的頭部,雖然官網對爬蟲沒有任何限制,處於習慣,還是更改一下頭部更好啦
hd = {'user-agent':'chorme/10'}
#更改requests請求的頭信息,用來防止網頁的反爬蟲,也可來僞裝自己訪問網頁的信息,這裏用最簡單的chorm(瀏覽器)版本10代替
3.對網頁進行解析,從中獲取自己想要的圖片鏈接
查看網頁的源碼,來看爬取圖片的所在的標籤,上圖說話
可以直觀的看出,自己想要爬取的圖片的相關信息都在img標籤當中,所以接下來就把所有的img標籤爬取,並對其進行分析即可,但是觀察發現,不知道問什麼,每一張圖片的img標籤竟然不同,不可以使用正則表達式,而且最氣人的是,有的圖片有直接在屬性中給出相應的下載鏈接,但有的沒有,只能自己拼接,哎,只能使用基本的方法嘍,上代碼!
url = 'http://soft.sxau.edu.cn/info/1013/2388.htm' #爬取網頁的url
picture = 'http://211.82.8.2:8080/system/_owners/soft/_webprj/' #設置下載圖片的頭部,根據網頁源碼得出,並不是每一個img標籤都有相對應的圖片下載鏈接,但都有相應的src,這裏爲最後的保存圖片做準備
text = getHTML(url)
soup = BeautifulSoup(text,'html.parser')
a = soup.find_all('img') #直接找出所有的img標籤,觀察發現每個圖片的img標籤並不一樣,不能用正則表達式來統一查找
urlInfo = [] #用來保存每一個圖片拼接好的下載鏈接
for tag in a:
new_url = tag.attrs['src'] #得到img屬性當中的src
urlInfo.append(picture+new_url.split('/',2)[-1]) #通過spilt函數剪切src並於之前的圖片頭部進行拼接,得到每個圖片的下載地址
每行代碼後都有詳細的註釋喲,拼接這個下載鏈接真的讓我廢了功夫,體現出一個初學者的心酸。。。
4.保存下載的圖片
先上代碼再說話!
#保存圖片,思路:將所有的圖片保存在本地的一個文件夾下,用圖片的url鏈接的後綴名來命名
dir_name = 'teacherImage' #設置文件夾的名字
if not os.path.exists(dir_name): #os模塊判斷並創建
os.mkdir(dir_name)
for img_url in urlInfo:
time.sleep(1) #設置間隔時間,防止把網頁爬崩
picture_name = img_url.split('/')[-1] #提取圖片url後綴
reponse = requests.get(img_url)
with open(dir_name+'/'+picture_name,'wb') as f:
f.write(reponse.content)
主要使用os模塊,簡單明瞭快捷,大體推薦,哈哈哈哈哈哈哈
5.出結果
一套武功耍下來,就會出現以下的結果,當然成功啦!
這些照片將來都是滿滿大學的懷念呀!