python3爬取网络图片的小程序项目

最近在学习python3网络爬虫,看的是这位学长的博客

因为刚刚开始接触,想通过实战来一步步学习,所以先记录下我的学习心得,然后再记录下自己实战的成果以及相关的代码程序。

  • 先声明,以下是学习心得,代码原搬,链接在上。

##开始爬取的图片的下载代码的演示

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
'''
#开始爬取的图片的下载代码的演示
'''
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import requests
import os
import time
if __name__ == '__main__':
# 指定页面图片的多少数量
for num in range(1, 5):
if num == 1:
url = 'http://www.shuaia.net/index.html'
else:
url = 'http://www.shuaia.net/index_%d.html' % num
# 因为是下载多个页面的图片,所以之后的图片名称与其相应的图片地址的代码抒写在for循环下编写
'''
#在此需要设置代理,避免爬取失败几率
'''
headers = {'User-Agent':
'* Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'}
# 利用requests模块中的方法获取URL信息,加上我们的代理
re = requests.get(url=url, headers=headers)
# 指定编码,避免中文乱码
re.encoding = 'utf-8'
'''
# 利用beautifulsoup模块来进行处理
#re.text : 转换成规定的字符格式
#'lxml' : 利用lxml解析器进行解析
'''
bf = BeautifulSoup(re.text, 'lxml')
# 解析完成之后,需要对页面的html信息进行分析了,指定相关的节点
'''
#class_是为了避免错误混淆,所以不可"原班人马"
'''
tasges_html = bf.find_all(class_='item-img')
# 指定空的列表,装下相关的需要的信息
list = []
# 利用循环,一一导入
for each in tasges_html:
'''
#加上img是因为'alt'在以下的子节点中,所以需要相关的指明,即一个节点(父,子)一个指明
'''
list.append(each.img.get('alt') + '=' + each.get('href'))
# 至此,相关的信息就采集完成了
print('采集over,开始下载:')
'''
#开始将采集好的信息一一下载
'''
for each_img in list:
# 以=分割图片地址与图片名称
img_info = each_img.split('=')
target_url = img_info[1]
filename = img_info[0] + '.jpg'
print('下载:' + filename)
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
img_req = requests.get(url=target_url, headers=headers)
img_req.encoding = 'utf-8'
img_html = img_req.text
img_bf_1 = BeautifulSoup(img_html, 'lxml')
img_url = img_bf_1.find_all('div', class_='wr-single-content-list')
img_bf_2 = BeautifulSoup(str(img_url), 'lxml')
img_url = 'http://www.shuaia.net' + img_bf_2.div.img.get('src')
#若是指定的目录不存在则建立一个
if 'images' not in os.listdir():
os.makedirs('images')
# 即指定URL地址下载
urlretrieve(url=img_url, filename='images/' + filename)
time.sleep(1)
print('下载完成!')
```
> **以上是通过学习[此篇博客文章](http://blog.csdn.net/c406495762/article/details/72597755)的学习心得,相关的加上图片解说可以看这篇博客文章。**
* **附上用得到的知识链接:**
[Python中time模块详解](http://qinxuye.me/article/details-about-time-module-in-python/)
[python3中的urlretrieve() 函数使用](http://blog.csdn.net/vevenlcf/article/details/46777023)
[urllib.request文档](https://docs.python.org/3/library/urllib.request.html)
[Requests文档](http://docs.python-requests.org/zh_CN/latest/user/quickstart.html)
[Python3 os模块文件/目录方法](http://www.runoob.com/python3/python3-os-file-methods.html)
[Beautiful Soup 4.2.0 文档](https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html)
[Python 文件I/O模块文档](http://www.runoob.com/python/python-files-io.html)
## 实战部分:批量爬取美女图片
> 在这里收藏上[这一篇python3爬取图片的快速入门地址](http://www.bijishequ.com/detail/424024?p=),有相关的模块方法介绍,有助于快速入门,再从一系列模块入手,之后再实战,一步步掌握。
* 通过另外一个网站的分析,爬取其图片并且下载。(下载的图片均可在本工程目录可找到)
**网址:http://www.27270.com/ent/meinvtupian/2017/223643.html**
> 搜索的美女图片关键词,随便点开的一个...
现在我们打开网址,利用*Chrome*浏览器的抓包,看看此网址的*html*信息(如下)
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.02.32.png)
* ****
在此有一个特别好用的方法,即为点击下方指出的图标,当我们把鼠标移到网页上的异常时,对应的*html*信息就会自动对齐。
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/3%E6%9C%88-08-2018%2020-10-20.gif)
> 现在开始分析代码,这个网址是专题式的...点开一个专题就会有一个类型的图片...就网页看来一个页面仅仅一张图片。
**在我们将鼠标移到图片处时,对应的代码也就自动对齐了(图1),还有它在的那个节点(图2),再点击下一张看看,查看*html*信息(图3),发现它们的节点信息一致,不同的仅仅为对应的标题以及图片的目录地址了(图4),我们可以从这里下手一步步来**
* 图1
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.14.53.png)
* 图2
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.14.35.png)
* 图3
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.14.14.png)
* 图4
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.15.00.png)
> 关于*html*的基础知识,只需要知道它们的结构以及节点,一些变量等的基础知识就够了,不需要太深入。可以在网上搜索关键词‘html基础知识’查看。这绝对是一劳永逸的。
在分析之后写个测试代码:
'''
爬取美女图片实战代码
'''
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
url = 'http://www.27270.com/ent/meinvtupian/2017/223643.html'
re = requests.get(url=url)
# 编译解码格式,避免乱码出现
re.encoding = 'utf-8'
# 用beautiful模块进行解析
bf = BeautifulSoup(re.text, 'lxml')
#在此注意find_all与find方法的使用,因为一个页面仅仅有一张图片,用前者会出错
bf_html = bf.find('div', class_='articleV4Body')
list_html = []
list_html.append(bf_html.img.get('alt') + ' : ' + bf_html.img.get('src'))
print(list_html)
运行,发现出现了乱码的情况:
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.30.29.png)
'utf-8'格式换成了'GB2312',发现乱码问题得到解决:
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.35.17.png)
* ****
查看了一下*html*信息,发现'utf-8'格式是不可取的,对于这个网站来说。
![](https://liu-1258031152.cos.ap-beijing.myqcloud.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-03-08%20%E4%B8%8B%E5%8D%888.34.26.png)
还可以用以下这段代码得出网址的编码方式。
```python
#关于输出网页编码方式的判断
from urllib import request
import chardet
if __name__ == "__main__":
response = request.urlopen("http://www.27270.com/ent/meinvtupian/2017/223643.html")
html = response.read()
charset = chardet.detect(html)
print(charset)

运行看看:

得到了图片的目录信息以及相关的信息之后,就好办了。


为什么这么说?实际上我们爬取图片时仅仅需要图片的目录地址就可以利用一两行python爬虫代码下载下来了,代码利用urllib.requests模块中的urlretrieve() 函数就能轻而易举的办到。代码在下,也可以查看相关的文档来学习。

1
2
3
4
5
6
7
8
from urllib.request import urlretrieve
import time
# 简单爬取一张图片,或者是需要代理的测试
if __name__ == '__main__':
print('开始下载:')
urlretrieve(url='html上的图片src信息', filename='xx照片'+'.jpg')
time.sleep(1)
print('下载完成!')

可以自己试试。


因为我们是为了爬取多张图片…所以可以分析一下每一页URL的不同或者是相似点。看图1,2发现了有索引_2出现,那再点击下一页会有_3
每一页有不同的照片,因为是一个专题…那么照片地址也不一样了(如图3,4)。

  • 图1

  • 图2


  • 图3

  • 图4

可以轻而易举的发现问题的所在了,接下来直接贴上完整的下载代码,不懂的朋友应当找相关的文档来自己查看,多写多实战!

完整代码

  • 代码编译步骤:查看信息到分析整合最后是代码实现。
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
'''
函数目标:
爬取美女图片完整代码
编写开始时间:
2018-3-08
'''
import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import os
import time
if __name__ == '__main__':
# 一个专题8页..
for num in range(1, 9):
if num == 1:
url = 'http://www.27270.com/ent/meinvtupian/2017/223643.html'
else:
url = 'http://www.27270.com/ent/meinvtupian/2017/223643_%d.html' % num
# 在此就不添加代理部分的了,添加可起到隐蔽的效果,在需要的场合应当添加上
re = requests.get(url=url)
# 之指定编码格式
re.encoding = 'GB2312'
# 用beautiful模块解析,具体可查看文档内容
bf = BeautifulSoup(re.text, 'lxml')
# 一页一张,用find方法
bf_html = bf.find('div', class_='articleV4Body')
# 在创建的目录下保存!
urlretrieve(url=bf_html.img.get('src'), filename=bf_html.img.get('alt') + '系列之%d.jpg' % num)
# 一秒一个步骤实行代码
time.sleep(1)
print('开始下载第%d张' % num)
print('下载完成,请查收...')

运行,查看效果:

在本工程目录夹可查收…


最后总结

代码还可以完善,比如可创建一个目录专门便于我们查收…

总之,还需要多多学习。

修改添加目录程序

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
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import os
import time
if __name__ == '__main__':
#可先建立一个专门存放图片的目录文件夹
if 'images' not in os.listdir():
os.makedirs('images')
print('建立目录夹完成,开始下载图片!')
# 一个专题8页..
for num in range(1, 9):
if num == 1:
url = 'http://www.27270.com/ent/meinvtupian/2017/223643.html'
else:
url = 'http://www.27270.com/ent/meinvtupian/2017/223643_%d.html' % num
# 在此就不添加代理部分的了,添加可起到隐蔽的效果,在需要的场合应当添加上
re = requests.get(url=url)
# 之指定编码格式
re.encoding = 'GB2312'
# 用beautiful模块解析,具体可查看文档内容
bf = BeautifulSoup(re.text, 'lxml')
# 一页一张,用find方法
bf_html = bf.find('div', class_='articleV4Body')
# 在创建的目录下保存!
urlretrieve(url=bf_html.img.get('src'), filename='images/'+bf_html.img.get('alt') + '系列之%d.jpg' % num)
# 一秒一个步骤实行代码
time.sleep(1)
print('开始下载第%d张' % num)
print('下载完成,请查收...')
---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。