切换视频源:

小练习: 下载美图

作者: 莫烦 编辑: 莫烦 2017-12-30

学习资料:

学会爬虫, 关键在于练习, 见多识广, 见多了网页的构造, 才知道怎么爬. 今天我们就来一个小实战, 结合之前学习的 requests 访问下载功能, 还有 BeautifulSoup, 来下载一些国家地理杂志的美图.

小练习: 下载美图

找到图片位置

说白了, 每次的爬虫, 都是先分析一下这个网页要找的东西的位置, 然后怎么索引上这个位置, 最后用 python 找到它. 这次也是这个逻辑. 我们看看今天要爬的这个图片网址. 定位到最新图片的位置,

小练习: 下载美图

找到这张图片的所在位置, 对比这类型的图片, 找到一种手段来筛选这些图片. 发现他们都存在于 img_list 的这种 <ul> 中.

小练习: 下载美图

而图片地址都是在 <img> 中.

<img src="http://image.nationalgeographic.com.cn/2017/1228/20171228030617696.jpg">

现在我们有了思路, 先找带有 img_list 的这种 <ul>, 然后在 <ul> 里面找 <img>.

下载图片

有了思路, 现在我们就用 python 来下图吧. import BeautifulSoup 和 requests. 定义爬取的 url.

from bs4 import BeautifulSoup
import requests

URL = "http://www.nationalgeographic.com.cn/animals/"

用 BeautifulSoup 找到带有 img_list 的这种 <ul>,

html = requests.get(URL).text
soup = BeautifulSoup(html, 'lxml')
img_ul = soup.find_all('ul', {"class": "img_list"})

从 ul 中找到所有的 <img>, 然后提取 <img>src 属性, 里面的就是图片的网址啦. 接着, 就用之前在 requests 下载那节内容里提到的一段段下载.

for ul in img_ul:
    imgs = ul.find_all('img')
    for img in imgs:
        url = img['src']
        r = requests.get(url, 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):
                f.write(chunk)
        print('Saved %s' % image_name)

"""
Saved 20171227102206573.jpg
...
Saved 20171214020322682.jpg
"""

我从下载好的照片中抽了一张出来, 哈哈, 是张河马.

小练习: 下载美图

如果你只是偶尔爬一爬网页, 学到目前为止, 你已经入门了, 但是如果你想要继续深入, 你开始对爬虫的效率担忧, 觉得自己爬得太慢, 想要大规模爬取网页, 那么接下来的内容就再适合你不过了. 接下来我们就会提到爬虫的提效方法. 而且现在我们爬取的都是静态网页 (莫烦python 就是静态网页), 如果你遇到 JavaScript 很多的动态加载网页 (淘宝等), 后面的 selenium 教程就很适合你.

相关教程

分享到: Facebook 微博 微信 Twitter
如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人. 莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 赞助他一点点, 作为鼓励他继续开源的动力.

支持 让教学变得更优秀