Python 實用爬蟲-04-使用 BeautifulSoup 去水印下載 CSDN 部落格圖片
其實沒太大用,就是方便一些,因為現在各個平臺之間的圖片都不能共享,比如說在 CSDN 不能用簡書的圖片,在部落格園不能用 CSDN 的圖片。
當前想到的方案就是:先把 CSDN 上的圖片都下載下來,再手動更新吧。
所以簡單寫了一個爬蟲用來下載 CSDN 平臺上的圖片,用於在其他平臺上更新圖片時用
更多內容,請看程式碼註釋
效果演示
Python 原始碼
提示: 需要先下載 BeautifulSoup 哦,可以用 pip,也可以直接在 PyCharm 中安裝
簡單的方法:
# coding:utf-8
'''
使用爬蟲下載圖片:
1.使用 CSDN 部落格
2.獲取圖片連線,並下載圖片
3.可去除水印
作者:java997.com
'''
import re
from urllib import request
from bs4 import BeautifulSoup
import datetime
# 構造無水印純連結陣列
def get_url_array(all_img_href):
img_urls = []
for h in all_img_href:
# 去掉水印
if re.findall("(.*?)\?", h[1]):
h = re.findall("(.*?)\?", h[1])
# 因為這裡匹配就只有 src 了, 所以直接用 0
img_urls.append(h[0])
else:
# 因為這裡還沒有處理有 alt 的情況, 所以直接用 1
img_urls.append(h[1])
return img_urls
# 構建新目錄的方法
def mkdir(path):
# 引入模組
import os
# 去除首位空格
path = path.strip()
# 去除尾部 \ 符號
path = path.rstrip("\\")
# 判斷路徑是否存在
# 存在 True
# 不存在 False
isExists = os.path.exists(path)
# 判斷結果
if not isExists:
# 如果不存在則建立目錄
# 建立目錄操作函式
os.makedirs(path)
print('目錄 ' + path + ' 建立成功')
return True
else:
# 如果目錄存在則不建立,並提示目錄已存在
print('目錄 ' + path + ' 已存在')
return False
if __name__ == '__main__':
# url = input("請貼上部落格連結")
url = "https://blog.csdn.net/qq_40147863/article/details/90484190"
# 獲取頁面 html
rsp = request.urlopen(url)
all_html = rsp.read()
# 一鍋清湯
soup = BeautifulSoup(all_html, 'lxml')
# bs 自動解碼
content = soup.prettify()
# 獲取標題
tags = soup.find_all(name='title')
for i in tags:
# .string 是去掉標籤, 只列印內容
print(i.string)
# 獲取正文部分
article = soup.find_all(name='article')
# print(article[0])
# 獲取圖片的連結
all_img_href = re.findall('<img(.*?)src="(.*?)"', str(article))
# 呼叫函式, 獲取去掉水印後的連結陣列
img_urls = get_url_array(all_img_href);
# 用當前之間為目錄名, 建立新目錄
now_time = datetime.datetime.now()
now_time_str = datetime.datetime.strftime(now_time, '%Y_%m_%d_%H_%M_%S')
mkdir(now_time_str)
print("----------下載圖片-------------")
i = 0
for m in img_urls:
# 由於沒有精確匹配,並不是所有連線都是我們要的課程的連線,排出第一張圖片
print('正在下載第' + str(i) + '張:' + m)
# 爬取每個網頁圖片的連線
img_url = request.urlopen(m).read()
# img 目錄【必須手動建立好】
fp = open(now_time_str+'\\' + str(i) + '.jpg', 'wb')
# 寫入本地檔案
fp.write(img_url)
# 目前沒有想到更好的方式,暫時只能寫一次,關閉一次,如果有更好的歡迎討論
fp.close()
i += 1