0%

一个小有意思的图片爬虫

一个小有意思的图片爬虫

爬取静态网站的图片方式其实很简单,就是将HTML页面里面的图片url找出来,并且一张张下载下来就好了,下面给出具体的做法:

首先我们打开这个网站:https://www.vmgirls.com/

这是他的主界面:

网站主页

可见这是一个适合年轻人学习爬虫的好网站呢

检查源代码

首先按照惯例,我们去分析网页里图片部分的源代码,这里我们爬取第一个,少女情怀总是诗里面的图片,首先我们点进去,右键一张图片,并且检查元素或者检查源代码:

可以看到这样的代码:

1
<img src="https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg" alt="" data-src="https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg" data-nclazyload="true" class="loaded" data-was-processed="true">

https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg 这一段url即为我们要找的图片地址,我们只需要将这样的url全部找出来,并且下载到文件夹里就好了

编写代码

首先给出我们需要的库:

1
2
3
import requests
import re
import time

其次,我们写一个函数,这个函数专门负责将网页的内容爬取下来:

1
2
3
4
def getHTMLText(url, kv):

r = requests.get(url, headers = kv)
return r.text

这段代码非常简单,仅仅就是爬取了网页的内容,其中kv是个键值对,后面会讲到用途

接下来我们写一个找出这些图片url的函数:

1
2
3
def Ulist(html):
ulist = re.findall('https://static\..*?\.jpeg', html)
return ulist

这个函数里就简单的用到了正则表达式,re.findall()这个函数在后面的博客会讲到,现在只要理解这个函数是用来表示正则表达式的,他的第一个参数即为正则表达式,后一个参数是待匹配的字符串。

这个正则表达式的意思是:
匹配开头为https://static.,中间为.*?,意思所有的字符匹配,并且为非贪婪模式,末尾是.jpeg的字符串,即为我们要爬取的图片格式

接下来我们写一个将这些url下载到文件夹里面的函数:

1
2
3
4
5
6
7
8
9
10
11
12
def save(info, i, kv):
j = 1
for url in info:
time.sleep(0.2)
try:
file_name = url.split('/')[-1]
print(f"现在正在爬取第{i + 1}页第{j}张照片")
res = requests.get(url, headers = kv)
with open(file_name, 'wb') as f:
f.write(res.content)
except:
continue

这段代码即为吧图片存到文件夹里,其中主要的就是try里面这一段,

1
file_name = url.split('/')[-1]

这一段为给图片起个名字,这里图方便就直接用url里最后一个\后面的内容,这个是字符串的基本操作

接下来就是打开文件,写入文件里了,res.content是图片的二进制格式,我们直接将它写到文件里,如果有的url报错,没有下载下来,那么会跳转到except执行,即continue

最后是主函数,主函数负责url的翻页操作,还有headers的伪装:

1
2
3
4
5
6
7
8
9
def main():
url = 'https://www.vmgirls.com/13344.html'
for i in range(7):
user = 'Mozilla' + str(i)
kv = {'user-agent': user}
html = getHTMLText(url, kv)
info = Ulist(html)
save(info, i, kv)
url = 'https://www.vmgirls.com/13344/page-' + str(i + 1) + '.html'

首先这个网页有7页,后面的url即为最开始的url里面加入page-页码,用上述的循环条件进行每一页的爬取

kv是一个伪装头,他会告诉网站我不是爬虫,实测如果只用一个头会被禁止访问,所以再循环里我们改变一下(也不确定是不是这个问题,不过改过后确实解决了被禁的问题),

源代码

这里给出源代码:

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
import requests
import re
import time

def getHTMLText(url, kv):

r = requests.get(url, headers = kv)
return r.text

def Ulist(html):
ulist = re.findall('https://static\..*?\.jpeg', html)
return ulist

def save(info, i, kv):
j = 1
for url in info:
time.sleep(0.2)
try:
file_name = url.split('/')[-1]
print(f"现在正在爬取第{i + 1}页第{j}张照片")
res = requests.get(url, headers = kv)
with open(file_name, 'wb') as f:
f.write(res.content)
j += 1
except:
continue

def main():
url = 'https://www.vmgirls.com/13344.html'
for i in range(7):
user = 'Mozilla' + str(i)
kv = {'user-agent': user}
html = getHTMLText(url, kv)
info = Ulist(html)
save(info, i, kv)
url = 'https://www.vmgirls.com/13344/page-' + str(i + 1) + '.html'
main()
成果展示

成果展示

我们的这个爬虫就到此完成

值得注意的是每个网页里都有重复的图片,我们爬下来时因为名字是相同的,所以被覆盖了