Python爬虫-基于深度优先策略的百度百科爬虫

深度优先策略:优先往纵向挖掘深入,直到到达指定的深度或者该节点不存在邻接节点,才会访问第二条路。
广度优先策略:先访问完一个深度的所有节点,再访问更深一层的所有节点。

分析-01.jpg

简单的看:
深度优先爬虫路径:A-B-E-F-C-D
广度优先爬虫路径:A-B-C-D-E-F

import requests
import re
import time

exist_urls=[]
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
}
#定义一个用来获取页面所有符合条件的链接函数
def scrapypy(url):
    try:
        response=requests.get(url=url,headers=headers)
        response.encoding='UTF-8'
        html=response.text
        link_lists=re.findall('.*?<a target=_blank href="/item/([^:#=<>]*?)".*?</a>',html)
        return link_lists
    except Exception as e:
        print(e)
        print('下载失败:'+url)
        return None
    finally:
        exist_urls.append(url)

#主函数用来定义输出格式,当爬取深度小于三层时,递归调用主函数,继续爬取第二层的所有链接
def main(start_url,depth=1):
    count=0
    link_lists=scrapypy(start_url)
    if link_lists:
        unique_lists=list(set(link_lists)-set(exist_urls))
        for unique_list in unique_lists:
            unique_list='https://baike.baidu.com/item/'+unique_list
            count=count+1
            output='No.'+str(count)+'\t Depth:'+str(depth)+'\t'+start_url+'======>'+unique_list+'\n'
            print(output)
            with open('title.txt','a+') as f:
                f.write(output)
                f.close()
            if depth<2:
                main(unique_list,depth+1)

if __name__=='__main__':
    t1=time.time()
 start_url='https://baike.baidu.com/item/%E7%99%BE%E5%BA%A6%E7%99%BE%E7%A7%91'
    main(start_url)
    t2=time.time()
    print('总时间',t2-t1)

爬取深度为2时的运行结果:

分析-01.png
分析-02.png

另外还尝试了深度为3的爬虫,爬了六万个就提示写不进去,暂且暂停了。后面继续学习广度优先的爬虫。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程。 一、网站的树结构 1...
    小怪聊职场阅读 9,477评论 5 45
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,277评论 0 12
  • 1 概述 图是数据结构中最复杂的形式,也是最烧脑的结构。无数的牛人乐此不疲地钻研,然而,时至今日,依然有很多问题等...
    CodingTech阅读 2,430评论 0 8
  • 关键词:寻路 ** 1.深度优先搜索(Depth-First-Search):**沿着树的深度遍历树的节点,尽可...
    ferrint阅读 795评论 0 0
  • 进入2017丁酉年对于属鸡人来讲进入了自己的本命年,出生的年柱地支跟命盘中所在的地支代表的宫位相同,从命理上来讲这...
    慈元阁阅读 720评论 0 3