python批量爬取圖片並保存在本地文件夾下

python批量爬取圖片並保存在本地文件夾下

本人目前是山西農業大學軟件學院大三的一名學生,由於疫情嚴重,積極響應黨和國家的號召宅在家中,今日閒來無事,就對學院的官網下手啦,將官網上介紹學院的老師的照片全部爬取下來,留作畢業後自己慢慢懷念吧,話不多說,進入正題,開搞!

  1. 導入的包

我們一共需要使用到四個包
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.出結果

一套武功耍下來,就會出現以下的結果,當然成功啦!
在這裏插入圖片描述
這些照片將來都是滿滿大學的懷念呀!

發佈了6 篇原創文章 · 獲贊 12 · 訪問量 3344
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章