爬取策略

关注公众号“轻松学编程”了解更多。

在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:

一、深度优先遍历策略

深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。我们以下面的图为例:遍历的路径:A-F-G E-H-I B C D

1、递归实现流程

a.获取种子链接 b.设置爬取深度 c.判断是否超出深度 d.爬取数据 e.生成子类url链接池 f.遍历子链接池,去重 g.深度加1,递归

  1. import re
  2. import requests
  3. # 设置请求头
  4. headers = {
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0;
  6. Win64; x64) AppleWebKit/537.36 (KHTML,
  7. like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
  8. def getHtml(url):
  9. '''
  10. 获取html源码
  11. :param url:
  12. :return:
  13. '''
  14. response = requests.get(url,headers=headers)
  15. return response.content.decode("utf-8",errors="ignore")
  16. def getUrl(url):
  17. '''
  18. 获取新url
  19. :param url:链接
  20. :return: urllist
  21. '''
  22. # 获取html
  23. html = getHtml(url)
  24. # print(html)
  25. # 清洗出新的url
  26. '''
  27. <a class="title-content" href="https://www.baidu.com/s?
  28. cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
  29. '''
  30. urlre = '<a .*href="(https?://.*?)".*'
  31. urlList = re.findall(urlre,html)
  32. print(urlList)
  33. return urlList
  34. def getInfo(url):
  35. '''
  36. 爬取数据
  37. :param url:
  38. :return:
  39. '''
  40. pass
  41. def depthSpider(url,depth):
  42. '''
  43. 递归实现深度爬取数据
  44. :param url: url链接
  45. :param depth: 爬取深度限制
  46. :return:
  47. '''
  48. # 判断是否超出深度,超出就结束
  49. if depthDict[url] > depth:
  50. return
  51. print("\t"*depthDict[url], "抓取第%d层:%s"
  52. %(depthDict[url], url))
  53. # 要实现的爬虫,爬取数据
  54. # getInfo(url)
  55. #生成子类url链接池
  56. sonUrlList = getUrl(url)
  57. #遍历子链接池
  58. for newurl in sonUrlList:
  59. #去重
  60. if newurl not in depthDict:
  61. #层级加1
  62. depthDict[newurl] = depthDict[url]+1
  63. #递归
  64. depthSpider(newurl,depth)
  65. if __name__ == '__main__':
  66. # 种子链接
  67. startUrl = "https://www.baidu.com/s?wd=世界杯"
  68. #设置爬取深度,设置爬取深度为4
  69. depthLimit = 2
  70. depthDict = {}
  71. depthDict[startUrl] = 1
  72. # 深度抓取
  73. depthSpider(startUrl,depthLimit)
2、栈实现流程

a.获取种子链接 b.用栈实现深度,设置爬取深度 c.判断栈是否为空 d.从栈中拿出一个url e.判断是否超出深度 f.爬取数据 g.生成子类url链接池 h.遍历子链接池,去重 i.深度加1,添加到栈中

  1. import requests
  2. import re
  3. # 设置请求头
  4. header = {
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0;
  6. Win64; x64) AppleWebKit/537.36 (KHTML,
  7. like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
  8. def getHtml(url):
  9. '''
  10. 获取html源码
  11. :param url:
  12. :return:
  13. '''
  14. response = requests.get(url,headers=header)
  15. return response.content.decode("utf-8",errors="ignore")
  16. def getUrl(url):
  17. '''
  18. 生成url链接池
  19. :param url: 链接
  20. :return: 列表
  21. '''
  22. # 获取html源码
  23. html = getHtml(url)
  24. # print(html)
  25. # 清洗出新的url
  26. '''
  27. <a class="title-content" href="https://www.baidu.com/s?
  28. cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
  29. '''
  30. urlre = '<a .*href="(https?://.*?)".*'
  31. urlsList = re.findall(urlre,html)
  32. return urlsList
  33. def getInfo(url):
  34. '''
  35. 爬取数据
  36. :param url:
  37. :return:
  38. '''
  39. pass
  40. def stackSpider(depth):
  41. '''
  42. 栈实现深度爬取数据
  43. :param depth: 深度
  44. :return:
  45. '''
  46. while len(urlList) > 0:
  47. # 从栈中取出一个url,先进后出
  48. url = urlList.pop()
  49. if depthDict[url] <= depth:
  50. print("\t\t\t" * depthDict[url],
  51. "抓取了第%d层:%s" % (depthDict[url], url))
  52. # 要实现的爬虫,爬取数据
  53. # getInfo(url)
  54. # 生成子类url链接池
  55. sonUrlLisr = getUrl(url)
  56. # 遍历子类url链接池
  57. for newurl in sonUrlLisr:
  58. if newurl not in depthDict:
  59. depthDict[newurl] = depthDict[url] +1
  60. #深度加1,添加到栈中
  61. urlList.append(newurl)
  62. if __name__ == '__main__':
  63. #设置种子链接
  64. startUrl = "https://www.baidu.com/s?wd=世界杯"
  65. #用队列实现广度
  66. urlList = []
  67. urlList.append(startUrl)
  68. # 设置爬取深度,设置爬取深度为4
  69. depthLimit = 3
  70. depthDict = {}
  71. depthDict[startUrl] = 1
  72. # 广度爬取
  73. stackSpider(depthLimit)

二、广度优先遍历策略

广度优先遍历策略的基本思路是,将新下载网页中发现的链接直接追加到待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以上面的图为例:遍历路径:A-B-C-D-E-F-G-H-I

1、队列实现流程

a.获取种子链接 b.用队列实现广度,设置爬取深度 c.判断队列是否为空 d.从队列拿出一个url e.判断是否超出深度 f.爬取数据 g.生成子类url链接池 h.遍历子链接池,去重 i.深度加1,添加到队列中

  1. '''
  2. a.获取种子链接 b.用队列实现广度,设置爬取深度 c.判断队列是否为空
  3. d.从队列拿出一个url e.判断是否超出深度 f.爬取数据
  4. g.生成子类url链接池 h.遍历子链接池,去重 i.深度加1,添加到队列中
  5. '''
  6. import requests
  7. import re
  8. # 设置请求头
  9. header = {
  10. "User-Agent": "Mozilla/5.0 (Windows NT 10.0;
  11. Win64; x64) AppleWebKit/537.36 (KHTML,
  12. like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
  13. def getHtml(url):
  14. '''
  15. 获取html源码
  16. :param url:
  17. :return:
  18. '''
  19. response = requests.get(url,headers=header)
  20. return response.content.decode("utf-8",errors="ignore")
  21. def getUrl(url):
  22. '''
  23. 生成url链接池
  24. :param url: 链接
  25. :return: 列表
  26. '''
  27. # 获取html源码
  28. html = getHtml(url)
  29. # print(html)
  30. # 清洗出新的url
  31. '''
  32. <a class="title-content" href="https://www.baidu.com/s?
  33. cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
  34. '''
  35. urlre = '<a .*href="(https?://.*?)".*'
  36. urlsList = re.findall(urlre,html)
  37. return urlsList
  38. def getInfo(url):
  39. '''
  40. 爬取数据
  41. :param url:
  42. :return:
  43. '''
  44. pass
  45. def vastSpider(depth):
  46. '''
  47. 队列实现广度爬取数据
  48. :param depth: 深度
  49. :return:
  50. '''
  51. while len(urlList) > 0:
  52. # 从队列中取出一个url
  53. url = urlList.pop(0)
  54. if depthDict[url] <= depth:
  55. print("\t\t\t" * depthDict[url],
  56. "抓取了第%d层:%s" % (depthDict[url], url))
  57. # 要实现的爬虫,爬取数据
  58. # getInfo(url)
  59. # 生成子类url链接池
  60. sonUrlLisr = getUrl(url)
  61. # 遍历子类url链接池
  62. for newurl in sonUrlLisr:
  63. #去重
  64. if newurl not in depthDict:
  65. depthDict[newurl] = depthDict[url] +1
  66. #深度加1,添加到队列中
  67. urlList.append(newurl)
  68. if __name__ == '__main__':
  69. #设置种子链接
  70. startUrl = "https://www.baidu.com/s?wd=世界杯"
  71. #用队列实现广度
  72. urlList = []
  73. urlList.append(startUrl)
  74. # 设置爬取深度,设置爬取深度为4
  75. depthLimit = 2
  76. depthDict = {}
  77. depthDict[startUrl] = 1
  78. # 广度爬取
  79. vastSpider(depthLimit)

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python爬虫爬取策略的更多相关文章

  1. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  2. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  3. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  4. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  5. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

  6. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  7. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  8. 一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...

  9. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

随机推荐

  1. python学习笔记1之-python简介及其环境安装

    python学习笔记之-python简介及其环境安装 最近几年python之火不用多说,最近开始利用时间自学python,在学习的过程中,按照自己的思路和理解记录下学习的过程,并分享出来,如果正好你也 ...

  2. 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)

    为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ...

  3. Spring学习(四)--Spring的IOC

    1.BeaDefinition的Resource定位 (1)直接使用BeanDefinitionFactory 定义一个Resource来定位容器使用的BeanDefinition. Resource ...

  4. day61:Linux:权限管理&rpm软件包管理&yum工具

    目录 1.权限管理 2.rpm软件包管理 3.yum工具(联网) 权限管理 1.什么是权限? 权限主要用来约束用户能对系统所做的操作 2.为什么要使用权限? 因为系统中不可能只存在一个root用户,一 ...

  5. py004.python的逻辑运算,随机数及判断语句if,elif,else

    判断语句又称 "分支语句" if判断语句的格式: if 条件1: 条件1满足时,执行的代码 -- # 前面有缩进4个空格 elif 条件2: 条件2满足时,执行的代码 -- # 前 ...

  6. 机器学习可解释性系列 - 是什么&为什么&怎么做

    机器学习可解释性分析 可解释性通常是指使用人类可以理解的方式,基于当前的业务,针对模型的结果进行总结分析: 一般来说,计算机通常无法解释它自身的预测结果,此时就需要一定的人工参与来完成可解释性工作: ...

  7. Java知识系统回顾整理01基础06数组02初始化数组

    一.分配空间与赋值分步进行 分配空间与赋值分步进行 public class HelloWorld { public static void main(String[] args) { int[] a ...

  8. 《C++primerplus》第11章练习题

    1.修改程序清单11.5(随机漫步),使之以特定的格式将结果写入文件中. //vector.h -- Vector Class #ifndef _VECTOR_H_ #define _VECTOR_H ...

  9. 一道web入门题

    9月27日00:00 这道题是我将hctf_warmup魔改之后得到的,难度比较低,主要还是讲一些web相关的思考方式,所以这篇文章会比较冗长过于详细.(毕竟是给小姑娘入门看的23333).就当M1s ...

  10. Docker笔记1:Docker 的介绍

    目  录 1.Docker 简介 2.Docker 特性 3.Docker 应用场景 4.Docker 优点 1.Docker 简介     Docker 提供了一个可以运行你的应用程序的封套(env ...