一、导入工具
from bs4 import BeautifulSoup as BS
import requests
import os
1、从 bs4
中导入 BeautifulSoup
,并且命名为 BS
,中文文档
2、导入 requests
,用于发出请求,中文文档
3、导入 os
用于文件操作,这里用来存图片,英文文档
二、定义变量
URL = "http://www.ngchina.com.cn/animals/"
html = requests.get(URL).text
soup = BS(html, 'lxml')
img_ul = soup.find_all('ul', {"class": "img_list"})
os.makedirs('./img/', exist_ok=True)
1、URL
是 国家地理动物系列的主页地址
2、通过 requests.get(URL)
获取到目标页面的 requests
对象,这个对象的文本内容在 text
属性上,html
是目标页面的 html
文本结构
如果想看一下
requests
对象都含有哪些属性和方法可以使用 dir()
,比如:print(dir(requests))
3、使用
BS
解析获取到的 html
,采用第三方解析器 lxml
(这玩意得安装:pip install lxml
)4、通过查看国家地理网页结构后得知图片在类名为
img_list
的 ul
标签中5、
makedirs
方法是递归创建。在当前目录下(./
代表当前目录)创建 img
目录,exist_ok=True
意味着如果已经有 img
目录,就直接使用这个文件夹;exist_ok=False
则是如果之前已经有了 img
目录则报错;
三、获取到 img 标签并将图片转存到之前创建的 img 目录中
这部分直接在代码里说明
for ul in img_ul:
imgs = ul.find_all('img') # 在 ul 标签中找到 img 标签,其实下面也可以不用循环,因为这个页面中,每个 ul 只有一个 img
for img in imgs:
url = img['src'] # 获取到 img 标签的 src 属性,即图片地址
r = requests.get(url, stream=True) # stream=True 使用流的方式下载,目的是实现边下边存,而不是下载完了再存
image_name = url.split('/')[-1] # 这是给图片命名
with open('./img/%s' % image_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=128): # 128个单位作为一个块
f.write(chunk)
print('Saved %s' % image_name)
四、完整代码
from bs4 import BeautifulSoup as BS
import requests
import os
URL = "http://www.ngchina.com.cn/animals/"
html = requests.get(URL).text
soup = BS(html, 'lxml')
img_ul = soup.find_all('ul', {"class": "img_list"})
os.makedirs('./img/', exist_ok=True)
for ul in img_ul:
imgs = ul.find_all('img') # 在 ul 标签中找到 img 标签,其实下面也可以不用循环,因为这个页面中,每个 ul 只有一个 img
for img in imgs:
url = img['src'] # 获取到 img 标签的 src 属性,即图片地址
r = requests.get(url, stream=True) # stream=True 使用流的方式下载,目的是实现边下边存,而不是下载完了再存
image_name = url.split('/')[-1] # 这是给图片命名
with open('./img/%s' % image_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=128): # 128个单位作为一个块
f.write(chunk)
print('Saved %s' % image_name)
之所以有六张是因为网页中有个【查看更多】