在前面我们介绍了如何通过某个页面爬取与之关联的外部网页,当时介绍的是使用广度优先搜索的方式爬取。
在本节,我们将介绍另一种爬取外部链接的方式,即深度优先搜索,爬取网页的分页。
由于本人喜欢古诗词,今天爬取的网页的内容就是古诗词,爬取的链接为:https://so.gushiwen.org/shiwen/。
如下图所示:
在同一个网页,内容是通过分页的形式进行展示,今天介绍如何爬取分页。
一、思路分析
我们知道,对于网页的分页内容访问,我们通常可以通过点击“上一页”或者“下一页”按钮访问关联的页面。
因此,在爬取分页内容的时候,我们可以采用这一思路,进行深度递归,即可访问所有的分页内容。
当然,事实上,由于软件工程师在编码过程中会对不同分页的url做一定的映射,因此除了以上思路,我们可以选择另外一种解决办法就是分析这种映射关系是什么。
如果能确定映射关系,那么就不需要进行深度递归,毕竟操作系统对于编程语言的栈的深度是有限制的,比如python最多递归1000次,超过1000次将报栈溢出的错误。
在接下来的示例演示中将对两种方法进行介绍。
二、示例演示
1.深度递归访问分页内容
正如之前一直强调的,在使用网络爬虫进行网页爬取的时候,第一步总是先打开目标网页,然后在开发者模式下分析网页的特点,然后根据分析的结果进行爬取。
打开目标网页的结构如下图所示:
在网页中搜索“下一页”按钮所在的标签位置,我们可以看到如上的结果。并且通过认真观察,我们能够看见“下一页”所在的标签是一个超链接,因此我们可以猜测,这个链接就是用来从当前页跳转到下一页。
为了验证我们的猜想是否正确,我们可以直接点开“下一页”按钮的跳转页面是否与我们刚才观察的url一致。
打开“下一页”的页面,我们可以看到url如下:
显然,两个页面是存在联系的。浏览器中的url和超链接的url除了隔了域名https://so.gushiwen.org/不一样之外,后半部分都是一致的。
因此证实了我们的猜想是正确的,因此我们只需要获取页面中“下一页”中超链接的url,再拼接上域名,就能得到下一页页面的url。通过递归操作,我们能够爬取所有的页面。
这里定义一个函数进行实现,使用一个队列存储每次获取的url:
def getNextUrl(url,que):
'''
:return:
'''
if url==None or len(url)==0:
return
try:
html = requests.get(url)
html.encoding = None
new_url = bs.findAll("a", {"class": "amore"})[0].attrs['href']
new_url= domain_prefix+new_ur