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