爬取策略

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

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

一、深度优先遍历策略

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

1、递归实现流程

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

import re
import requests # 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def getHtml(url):
'''
获取html源码
:param url:
:return:
'''
response = requests.get(url,headers=headers)
return response.content.decode("utf-8",errors="ignore") def getUrl(url):
'''
获取新url
:param url:链接
:return: urllist
'''
# 获取html
html = getHtml(url)
# print(html)
# 清洗出新的url
'''
<a class="title-content" href="https://www.baidu.com/s?
cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
'''
urlre = '<a .*href="(https?://.*?)".*'
urlList = re.findall(urlre,html)
print(urlList)
return urlList def getInfo(url):
'''
爬取数据
:param url:
:return:
'''
pass def depthSpider(url,depth):
'''
递归实现深度爬取数据
:param url: url链接
:param depth: 爬取深度限制
:return:
'''
# 判断是否超出深度,超出就结束
if depthDict[url] > depth:
return
print("\t"*depthDict[url], "抓取第%d层:%s"
%(depthDict[url], url))
# 要实现的爬虫,爬取数据
# getInfo(url) #生成子类url链接池
sonUrlList = getUrl(url) #遍历子链接池
for newurl in sonUrlList:
#去重
if newurl not in depthDict:
#层级加1
depthDict[newurl] = depthDict[url]+1
#递归
depthSpider(newurl,depth) if __name__ == '__main__':
# 种子链接
startUrl = "https://www.baidu.com/s?wd=世界杯"
#设置爬取深度,设置爬取深度为4
depthLimit = 2
depthDict = {}
depthDict[startUrl] = 1
# 深度抓取
depthSpider(startUrl,depthLimit)
2、栈实现流程

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

import requests
import re # 设置请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def getHtml(url):
'''
获取html源码
:param url:
:return:
'''
response = requests.get(url,headers=header)
return response.content.decode("utf-8",errors="ignore") def getUrl(url):
'''
生成url链接池
:param url: 链接
:return: 列表
'''
# 获取html源码
html = getHtml(url)
# print(html)
# 清洗出新的url
'''
<a class="title-content" href="https://www.baidu.com/s?
cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
'''
urlre = '<a .*href="(https?://.*?)".*'
urlsList = re.findall(urlre,html)
return urlsList def getInfo(url):
'''
爬取数据
:param url:
:return:
'''
pass def stackSpider(depth):
'''
栈实现深度爬取数据
:param depth: 深度
:return:
'''
while len(urlList) > 0:
# 从栈中取出一个url,先进后出
url = urlList.pop()
if depthDict[url] <= depth:
print("\t\t\t" * depthDict[url],
"抓取了第%d层:%s" % (depthDict[url], url)) # 要实现的爬虫,爬取数据
# getInfo(url)
# 生成子类url链接池
sonUrlLisr = getUrl(url)
# 遍历子类url链接池
for newurl in sonUrlLisr:
if newurl not in depthDict:
depthDict[newurl] = depthDict[url] +1
#深度加1,添加到栈中
urlList.append(newurl) if __name__ == '__main__':
#设置种子链接
startUrl = "https://www.baidu.com/s?wd=世界杯"
#用队列实现广度
urlList = []
urlList.append(startUrl)
# 设置爬取深度,设置爬取深度为4
depthLimit = 3
depthDict = {}
depthDict[startUrl] = 1
# 广度爬取
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,添加到队列中

'''
a.获取种子链接 b.用队列实现广度,设置爬取深度 c.判断队列是否为空
d.从队列拿出一个url e.判断是否超出深度 f.爬取数据
g.生成子类url链接池 h.遍历子链接池,去重 i.深度加1,添加到队列中
'''
import requests
import re # 设置请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36"} def getHtml(url):
'''
获取html源码
:param url:
:return:
'''
response = requests.get(url,headers=header)
return response.content.decode("utf-8",errors="ignore") def getUrl(url):
'''
生成url链接池
:param url: 链接
:return: 列表
'''
# 获取html源码
html = getHtml(url)
# print(html)
# 清洗出新的url
'''
<a class="title-content" href="https://www.baidu.com/s?
cl=3&ap;rsv_idx=2" target="_blank">世界杯八强出炉</a>
'''
urlre = '<a .*href="(https?://.*?)".*'
urlsList = re.findall(urlre,html)
return urlsList def getInfo(url):
'''
爬取数据
:param url:
:return:
'''
pass def vastSpider(depth):
'''
队列实现广度爬取数据
:param depth: 深度
:return:
'''
while len(urlList) > 0:
# 从队列中取出一个url
url = urlList.pop(0)
if depthDict[url] <= depth:
print("\t\t\t" * depthDict[url],
"抓取了第%d层:%s" % (depthDict[url], url)) # 要实现的爬虫,爬取数据
# getInfo(url)
# 生成子类url链接池
sonUrlLisr = getUrl(url)
# 遍历子类url链接池
for newurl in sonUrlLisr:
#去重
if newurl not in depthDict:
depthDict[newurl] = depthDict[url] +1
#深度加1,添加到队列中
urlList.append(newurl) if __name__ == '__main__':
#设置种子链接
startUrl = "https://www.baidu.com/s?wd=世界杯"
#用队列实现广度
urlList = []
urlList.append(startUrl)
# 设置爬取深度,设置爬取深度为4
depthLimit = 2
depthDict = {}
depthDict[startUrl] = 1
# 广度爬取
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字符编码和二进制不得不说的故事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...

  2. Python下的图像处理库,你选哪个?

    奥里给~ 转载:https://blog.csdn.net/chen801090/article/details/105795068/ 在进行数字图像处理时,我们经常需要对图像进行读取.保存.缩放.裁 ...

  3. Keil ARm新建项目

    一.新建一个工程 选好芯片后确认,完成创建 二.新建一个文件 保存为后缀名为*.c的文件 三.把文件添加进项目里面 四.测试 发现有警告 五.给项目添加特定的文件,去除警告或错误 现在保存项目的文件夹 ...

  4. Centos 6.9安装 php5.6 过程中报错:Error: Package: php56w-mcrypt-5.6.40-1.w6.x86_64 (webtatic)

    在 CentOS 6.9 系统下安装 php 5.6 的过程中,执行如下命令: yum -y install php56w-pdo php56w-xml php56w-gd php56w-gd.x86 ...

  5. background-size 详解

    backgroun-size:cover; .是按照等比缩放铺满整个区域.主要用于图片比div小的时候,将图片按照某一边的比例扩大以填充整个div背景. .优点:图片不会被拉升,且实用于div长度和宽 ...

  6. ZooKeeper伪分布式集群安装及使用

    ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越 ...

  7. Linux最常用的命令大全

    Linux最常用的命令大全 按功能索引 目录处理命令 ls mkdir pwd cd rmdir cp mv rm 文件处理命令 touch cat tac more less head tail l ...

  8. MeteoInfoLab脚本示例:inpolygon

    inpollygon函数是用来判断带坐标(x/y)的数据是否在某个或者一组多边形(Polygon)中,返回的结果中如果做多边形内则值为1,否则值为-1.下面一个例子演示了利用一个shape文件和inp ...

  9. PHP SPL标准库-迭代器

    通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ...

  10. Linux文件元数据和节点表结构

    文件元数据 一块硬盘的分区可以认为有两部分组成,保存元数据的成为节点表,用来保存属性等. 元数据中有个小指针,指向数据存放的实际空间. 元数据(Metadata) 又称中介数据.中继数据,为描述数据的 ...