项目:下载所有XKCD 漫画
背景
博客和其他经常更新的网站通常有一个首页,其中有最新的帖子,以及一个“前一篇”按钮,将你带到以前的帖子。然后那个帖子也有一个“前一篇”按钮,以此类推。这创建了一条线索,从最近的页面,直到该网站的第一个帖子。如果你希望拷贝该网站的内容,在离线的时候阅读,可以手工导航至每个页面并保存。但这是很无聊的工作,所以让我们写一个程序来做这件事。XKCD 是一个流行的极客漫画网站,它符合这个结构。首页http://xkcd.com/有一个“Prev”按钮,让用户导航到前面的漫画。手工下载每张漫画要花较长的时间,但你可以写一个脚本,在几分钟内完成这件事。
练习内容
①webbrowser 模块
webbrowser.open() 启动一个新浏览器,打开指定的URL
②requests 模块
requests.get() 下载一个网页
接受一个要下载的URL 字符串,返回一个Response 对象,其中包含了Web 服务器对请求做出的响应
如果请求成功,下载的页面就作为一个字符串,保存在Response 对象的text变量中。这个变量保存了包含整部戏剧的一个大字符串,调用len(res.text)表明。
Response对象的raise_for_status()方法,检查下载是否成功。
使用for 循环和Response 对象的iter_content()方法,将Web 页面写入到一个文件。
③BeautifulSoup 模块
pip install beautifulsoup4
import bs4
bs4.BeautifulSoup() 创建一个BeautifulSoup 对象
用requests.get()函数从No Starch Press 网站下载主页,然后将响应结果的text 属性传递给bs4.BeautifulSoup()
**select()方法将返回一个Tag 对象的列表,这是Beautiful Soup 表示一个HTML元素的方式。针对BeautifulSoup 对象中的HTML 的每次匹配,列表中都有一个Tag对象。Tag 值可以传递给str()函数,显示它们代表的HTML 标签。Tag 值也可以有attrs 属性,它将该Tag 的所有HTML 属性作为一个字典。
Tag 对象的get()**方法让我们很容易从元素中获取属性值
参考思路
下面是程序要做的事:
① 加载主页;
② 保存该页的漫画图片;
③ 转入前一张漫画的链接;
④ 重复直到第一张漫画。
这意味着代码需要做下列事情:
- 利用requests 模块下载页面。
- 利用Beautiful Soup 找到页面中漫画图像的URL。
- 利用iter_content()下载漫画图像,并保存到硬盘。
- 找到前一张漫画的链接URL,然后重复。
第1步: 打开一个浏览器的开发者工具,检查该页面上的元素,你会发现下面的内容:
- 漫画图像文件的URL,由一个元素的href 属性给出。
- < img >元素在< div id=“comic” >元素之内。
- Prev 按钮有一个rel HTML 属性,值是prev。
- 第一张漫画的Prev 按钮链接到http://xkcd.com/# URL,表明没有前一个页面了。
#! python3
# downloadXkcd.py - Downloads every single XKCD comic.
import requests, os, bs4
url = 'http://xkcd.com' # starting url
os.makedirs('xkcd', exist_ok=True) # store comics in ./xkcd
while not url.endswith('#'):
#