爬取图片链接并保存

简单的爬取图片。

前言

这几天打算整理与迁移一下博客。因为之前觉得 CSDN 的 Markdown 编辑器很好用 ,所以之前的文章与相关图片都保存在 CSDN。而且 CSDN 支持一键导出自己的文章为 markdown 文件。但导出的文件中图片的连接依旧是 url 连接。为了方便将图片保存到本地,在这里保存一下爬虫代码。

只要修改正则匹配代码,同样适用于博客园爬取。

代码

为了提高效率,该脚本将从保存的本地 markdown 文件读取图片链接。当然脚本中也保留了爬取某个页面所有图片的函数。

脚本名:spider.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import urllib.request 
import urllib.parse
import sys
import os
import re


def open_url(url):
'''
用于网页爬取。这里不采用这个函数
'''
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')
# 访问url,并将页面的二进制数据赋值给 page
page = urllib.request.urlopen(req)
# 将page中的内容转换为utf-8编码
html = page.read().decode('utf-8')

return html


def read_file(file):
print('\n正在读取文件...')
with open(file, 'rb') as my_file:
content = my_file.read()
content = content.decode('utf-8')

print('已读取文件.')

return content


def get_img(content, file_path):

# 正则匹配图片链接
# p=r'<img src="([^"]+\.png)"' # 可用于网页爬取
p=r'https://img-blog\.csdnimg\.cn/[\w\-/]+\.(?:png|jpg|jpeg)'

#返回正则表达式在字符串中所有匹配结果的列表
print('\n正在读取图片链接...')
img_list=re.findall(p, content)
list_len = str(len(img_list))
print('已读取图片链接.\n')

for img_url in img_list:
print(img_url)
print('\n共 ' + list_len + ' 条数据')

# 图片保存位置。如果文件夹不存在则创建
save_path = file_path + '/assets/'

if not os.path.exists(save_path):
os.makedirs(save_path)

print('\n正在保存图片...\n')
num = 0 # 用于记录进度
for each in img_list:
#以 / 为分隔符,-1返回最后一个值
photo_name=each.split("/")[-1]

# print(photo_name)

#访问 each,并将页面的二进制数据赋值给photo
photo=urllib .request .urlopen(each)

w=photo .read()

# f=open(save_path + photo_name + '.png', 'wb')
f=open(save_path + photo_name, 'wb')
f.write(w)
f.close()

# 展示进度
print(num % 10, end="")
if (num + 1) % 10 == 0 and num != 0:
print(' 进度: ' + str(num + 1) + '/' + list_len)
sys.stdout.flush() # 刷新输出缓冲
num += 1

print('\n\n完成!\n')


if __name__=='__main__':
if len(sys.argv) != 2:
print("\nUsage: python spider.py <file>")
print('example: python spider.py "F:\\T\\test.md"')
sys.exit()

file = str(sys.argv[1])

file_name = os.path.basename(file)
file_path = os.path.dirname(file)
print('\nfile_name: ' + file_name)
print('file_path: ' + file_path)

# 读取文件内容
content = read_file(file)

# 爬取图片
get_img(content, file_path)

效果

在这里插入图片描述

在这里插入图片描述


别后相思人似月,云间水上到层城。

——《明月夜留别》(唐)李冶