URL 管理器

基本介绍

对外接口

对外提供两个接口:一个可以提取URL,一个可以增加URL,分别对应图上的1和2。

当要爬取某个网页时,则可以从1接口提取出该网页的URL进行爬取。

有时候爬取的网页内容中会包含别的网页链接,即包含有URL,此时可以把包含的URL提取出来,放入URL管理器,以便后续进行爬取,则可以利用2接口向URL管理器新增URL

实现逻辑

图中的3:从URL管理器取出一个URL时,将该URL的状态进行更改,如已爬取、爬取成功、爬取失败等(有多少种状态根据具体需求定义),以防止重复对同一URL进行爬取。

图中的4:把从爬取的网页内容中解析出来的URL放入到URL管理器中前,需要判断URL管理器中是否已存在该URL,已存在就不需要再添加,还是防止对同一URL进行重复爬取。

数据存储

实现URL管理器有5、6、7三种,

图中的5:利用python内存实现。

用python中的set集合实现URL管理器,set集合可以实现自动去重,而且可以快速的判断集合中是否已存在某个元素。

已爬取的URL可以用一个set来表示,未爬取的URL用另一个set集合表示。从未爬取的URL集合中取出一个URL进行爬取,并将该URL标记为已爬取URL,放入到已爬取URL的set集合中。当要新增一个URL时,即把新增URL放入未爬取URL集合中,如果未爬取URL集合已存在该URL,则不会重复添加,实现了图中4的逻辑。

如果一个URL有多种状态,如正在爬取中,爬取失败、爬取成功等,可以为每种状态设置一个set集合进行存储。当状态发生转变时,从相应的集合中取出放入到转变后的集合中。

图中的6:利用Redis实现

实现逻辑和python内存类似,区别在于Python内存一旦断电就要从头开始执行,但是Redis可以保存中间状态,断电后数据不会消失

图中的7:利用MySQL数据库表

可以利用一张urls表进行存储,该表中有两个字段:url 和 url 对应的状态(已爬取、未爬取等)

URL 管理器的代码实现(python内存实现)

class UrlManage:"""URL 管理器"""def __init__(self):# 待爬取 URL 集合self.new_urls = set()# 已爬取 URL 集合self.old_urls = set()def get_url(self):"""从URL管理器中获取URL进行爬取"""if self.has_new_url():url = self.new_urls.pop()self.old_urls.add(url)return urlreturn Nonedef add_new_url(self, url):"""新增一个 URL"""if url is None or len(url) == 0:returnif url in self.old_urls or url in self.new_urls:returnself.new_urls.add(url)def add_new_urls(self, *urls):"""批量新增 URL"""if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def has_new_url(self):"""判断是否还有待爬取 URL"""return len(self.new_urls) > 0# 测试代码
if __name__ == '__main__':url_manage = UrlManage()url_manage.add_new_url('url1')url_manage.add_new_urls('url1', 'url2', 'url3')print('已爬取set:', url_manage.old_urls, '未爬取set:', url_manage.new_urls)print('-' * 20)url = url_manage.get_url()print(url)print('已爬取set:', url_manage.old_urls, '未爬取set:', url_manage.new_urls)print('-' * 20)url = url_manage.get_url()print(url)print('已爬取set:', url_manage.old_urls, '未爬取set:', url_manage.new_urls)print('-' * 20)url = url_manage.get_url()print(url)print('已爬取set:', url_manage.old_urls, '未爬取set:', url_manage.new_urls)print('-' * 20)print(url_manage.has_new_url())print('已爬取set:', url_manage.old_urls, '未爬取set:', url_manage.new_urls)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112017.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode-简单题】剑指 Offer 05. 替换空格

文章目录 题目方法一:常规做法:方法二:双指针做法 题目 方法一:常规做法: class Solution {public String replaceSpace(String s) {int len s.length() ;StringBuffer str new StringBuffer();for(int i 0 ; i &l…

unity 使用Photon进行网络同步

Pun使用教程 第一步:请确保使用的 Unity 版本等于或高于 2017.4(不建议使用测试版)创建一个新项目。 第二步:打开资源商店并找到 PUN 2 资源并下载/安装它。 导入所有资源后,让 Unity 重新编译。 第三步&#xf…

Java文字描边效果实现

效果: FontUtil工具类的完整代码如下: 其中实现描边效果的函数为:generateAdaptiveStrokeFontImage() package com.ncarzone.data.contentcenter.biz.img.util;import org.springframework.core.io.ClassPathResource; import org.springfr…

Prompt-To-Prompt——仅通过文本进行图像编辑

文章目录 1.摘要2.算法2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-attentionWord SwapAdding a New PhraseAttention Re–weighting 3.应用Text-Only Localized EditingGlobal editingFader Control using Attention Re-weightingRea…

HPC集群自动弹性扩缩的两种实现方式

常青藤 HPC常青园 2023-07-28 19:48 发表于北京 弹性扩缩技术正在成为HPC集群中的一项重要技术。它可以根据实际需求动态调整集群资源,应对用户负载的波动。对于运维团队来说,自动弹性扩缩能够减轻集群运维负担,提高集群资源利用率&#xff0…

Kettle REST Client获取token调用接口解析JSON入文件实例

Kettle REST Client获取token调用接口解析JSON入文件实例 需求说明 通过kettle组件调用接口并解析JSON成结构化数据入文件。 完整实例 解决方法 利用生成记录组件定义URL参数通过REST ClENT组件请求得到TOKEN通过JSON INPUT组件解析接口请求的结果通过JAVASCRIPT组件拼接生…

储存高精长整型の另一种思路——二维数组

利用二维数组储存高精长整型 题目解题思路问题解决代码实现总结反思 题目 luogu P2437 蜜蜂路线 解题思路 最初只觉得是一道很简单的递推 先考虑从第一个点出发的情况,对于第 k ( k ≥ 3 ) k (k≥3) k(k≥3)个点,路线数表示如下: a [ k …

【二叉搜索树】将有序数组转换为二叉搜索树-力扣 108 题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

人工智能AI 全栈体系(四)

第一章 神经网络是如何实现的 除了全连接神经网络外,还有其他形式的神经网络。 此节将讲述神经网络的另一种形式:卷积神经网络。 四、卷积神经网络 首先我们看看全连接神经网络有什么不足。正如其名字一样,全连接神经网络,两个…

vscode json 无决找到“e:\...“

在上一章中提到了解决 无法使用 compilerPath 的问题,该问题明显是相对路径配置错误。 但是解决该问题后,发现输出了新的问题: 由该输出可知,在 e:\gitsource\ODrive-fw-v0.5.1\Firmware\ 路径下未找到 D:\gcc-arm-none-eabi-10.3-2021.10…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字: Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

Postman应用——接口请求(Get和Post请求)

文章目录 新增请求Get请求Post请求 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范,使用其他请求方式。 GET(SELECT):从服务器取出资源(一项或多项)POST(CR…