使用pythono爬取图片
参考学习的原文文档
1.前置
- 依然是python3版本 本人版本python 3.7.6
- 安装Beautiful Soup 4.4.0 用于解析成html
pip install beautifulsoup4
2.确定爬取的目标地址
本次的目标网站是unsplash,主打一个分享免费壁纸的网站,每日更新。
3.实现原理
- 和爬取小说类似,同样解析图片在HTML文档中的结构,拿到图片路径或者下载路径
- 但是问题在于怎么下载 ,实现原理:
- 使用requests.get()方法拿到图片信息,这时图片信息是二进制,然后我们在本地创建一个.jpg的文档,将二进制信息写入。
4.功能实现
- 分析目标页面DOM
从这里我们可以看到图片都放在了figure标签里面。那好,用昨天爬小说的方法尝试解析网页结构 - 尝试获取figure标签内容
import requests
from bs4 import BeautifulSoup
from contextlib import closing
res = requests.get('https://unsplash.com')
html = res.text
# 解析
bf = BeautifulSoup(html,'html.parser')
bf_root = bf.find_all('figure')
打印出来的结果如下
ok正确拿到信息,再回到原网页分析图片
- 继续分析页面图片路径
可以看到图片的下载路径直接包含在a标签里面,这样更简单了,只要解析出来a标签中的href就行了 - 解析a标签
- figure标签中有多个a标签,所以为了准确获取,这里最好在解析一下,保证结果正确
控制行打印的html文档可视性极差,可以将上一步figure打印结果复制到编辑器分析
这样们就能精确的拿到目标下载标签的上一级 div的类名
# 解析figure中的div
bf_div = BeautifulSoup(str(bf_root),'html.parser')
bf_a = bf_div.find_all('div','sBV1O')
# 解析a标签
bf_target = BeautifulSoup(str(bf_a),'html.parser')
a = bf_target.find_all('a')
打印结果如下
5.最后写入
# _*_ coding:UTF-8 _*_
import requests
from bs4 import BeautifulSoup
from contextlib import closing
res = requests.get('https://unsplash.com')
html = res.text
# 解析
bf = BeautifulSoup(html,'html.parser')
bf_root = bf.find_all('figure')
# 解析figure中的div
bf_div = BeautifulSoup(str(bf_root),'html.parser')
bf_a = bf_div.find_all('div','sBV1O')
# 解析a标签
bf_target = BeautifulSoup(str(bf_a),'html.parser')
a = bf_target.find_all('a')
# 遍历一下a标签
for item in a:
# 下载
with closing(requests.get(item.get('href'))) as r: # 获取图片信息
with open('%s.jpg' % item.get('href')[28:39] ,'ab+') as f: #创建一个jpg文档,我这里截取了下载链接的字符串作为名字
for chunk in r.iter_content(chunk_size=1024): # 读取图片信息
if chunk:
f.write(chunk) # 向创建的图片文档中写入读取的图片信息
f.flusha
下载速度比较慢
- 成果展示