爬取整个网站
为了爬取整个网站,我们得先分析该网站的数据是如何加载的。
还是以豆瓣读书为例,当我们点击第二页后,观察浏览器的地址栏,发现网址变了。网址变成了 https://book.douban.com/top250?start=25,和原来相比后面多了一个 ?start=25。
这部分被称为查询字符串,查询字符串作为用于搜索的参数或处理的数据传送给服务器处理,格式是 ?key1=value1&key2=value2。
? 前面是网页的地址,后面是查询字符串。以键值对 key=value 的形式赋值,多个键值对之间用 & 连接在一起。例如 ?a=1&b=2 表示:a 的值为 1,b 的值为 2。
查询字符串用于信息的传递,服务器通过它就能知道你想要什么,从而给你返回对应的内容。比如你在知乎搜索 python,网址会变成 https://www.zhihu.com/search?type=content&q=python,后面的查询字符串告诉服务器你想要的是有关 python 的内容,于是服务器便将有关 python 的内容返回给你了。
了解了查询字符串的相关知识后,接下来我们多翻几页豆瓣读书的页面,观察一下网址的变化规律:
网页规律.png
第二页 start=25,第三页 start=50,第十页 start=225,而每页的书籍数量是 25。
因为每页展示 25 本书,根据规律其实不难推测出 start 参数表示从第几本书开始展示,所以第一页 start 是 0,第二页 start 是 25,第三页 start 是 50,第十页 start 是 225。因此 start 的计算公式为 start = 25 * (页码数 - 1)(25 为每页展示的数量)。我们来通过代码自动生成豆瓣图书 Top250 所有数据(10 页)的地址:
url = 'https://book.douban.com/top250?start={}'
# num 从 0 开始因此不用再 -1
urls = [url.format(num * 25) for num in range(10)]
print(urls)
# 输出:
# [
# 'https://book.douban.com/top250?start=0',
# 'https://book.douban.com/top250?start=25',
# 'https://book.douban.com/top250?start=50',
# 'https://book.douban.com/top250?start=75',
# 'https://book.douban.com/top250?start=100',