为了账号安全,请及时绑定邮箱和手机立即绑定

使用 BeautifulSoup 爬取国家地理的图片

标签:
Python

一、导入工具

from bs4 import BeautifulSoup as BSimport requestsimport 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 文本结构

webp

就是这个东西


如果想看一下 requests 对象都含有哪些属性和方法可以使用 dir(),比如:print(dir(requests))

webp


3、使用 BS 解析获取到的 html,采用第三方解析器 lxml(这玩意得安装:pip install lxml
4、通过查看国家地理网页结构后得知图片在类名为 img_listul 标签中

webp

我们要爬取的图片


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 BSimport requestsimport 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)

webp

图片在这



作者:_白衣青衫_
链接:https://www.jianshu.com/p/3e1a250524e6


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消