Python的爬虫框架主要可以分为以下五个部分:

爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义;

URL管理器:负责URL的管理,包括带爬取和已爬取的URL、已经提供相应的接口函数(类似增删改查的函数)

网页下载器:负责通过URL将网页进行下载,主要是进行相应的伪装处理模拟浏览器访问、下载网页

网页解析器:负责网页信息的解析,这里是解析方式视具体需求来确定

信息采集器:负责将解析后的信息进行存储、显示等处理


代码示例是爬取CSDN博主下的所有文章为例,文章仅作为笔记使用,理论知识rarely

一、URL管理器简介

URL管理器主要负责对爬虫的URL进行管理,它会将待爬取的URL和已经爬取的URL分别记录下来。

URL管理器如要对外提供添加、查询URL的功能。

核心框架如下:

'''
自定义Python伪代码
'''
# 1. 初始化待管理的URL
# 2. 提供一系列操作URL的接口函数
# 例如:
# 添加一个URL
# 添加多个URl
# 查询是否有未爬取的URL
# 取出未爬取的URL
# ...

二、URL管理器示例:(爬取CSDN博主下的所有文章

# author : s260389826
# date : 2019/3/22
# position: chengdu class UrlManager(object):
def __init__(self):
self.urls_article_new = set() #待爬取文章
self.urls_article_old = set() #已爬取文章
self.urls_page_new = set() #待爬取页
self.urls_page_old = set() #已爬取页 def add_article_url(self, url):
'''
一次添加一个文章的URL
'''
if url is None:
print("url_manager: add article url error")
return
if url not in self.urls_article_new and url not in self.urls_article_old:
self.urls_article_new.add(url) def add_article_urls(self, urls):
'''
一次添加多个文章的URL
'''
if urls is None or len(urls) == 0:
print("url_manager: add article urls error")
return
for url in urls:
self.add_article_url(url) def add_page_url(self, url):
'''
一次添加一个页的URL
'''
if url is None:
print("url_manager: add page url error")
return
if url not in self.urls_page_new and url not in self.urls_page_old:
self.urls_page_new.add(url) def add_page_urls(self, urls):
'''
一次添加多个页的URL
'''
if urls is None or len(urls) == 0:
print("url_manager: add page urls error")
return
for url in urls:
self.add_page_url(url) def has_page_url(self):
'''
查询是否有带爬取的页
'''
return len(self.urls_page_new) != 0 def get_page_url(self):
'''
取出带爬取的页
'''
page_url = self.urls_page_new.pop()
self.urls_page_old.add(page_url)
return page_url

三、上述代码用到的知识点:

1. URL管理器使用集合:

    def __init__(self):
self.urls_article_new = set()
self.urls_article_old = set()
self.urls_page_new = set()
self.urls_page_old = set()

使用集合主要为了去除重复的URL,它可以自动的去除重复URL。非必须但是比较方便

2. 集合操作:

        page_url = self.urls_page_new.pop()
self.urls_page_old.add(page_url)

pop(): 从集合中去掉一个元素

add(): 往集合中添加一个元素

python3 爬虫五大模块之二:URL管理器的更多相关文章

  1. python3 爬虫五大模块之三:网页下载器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  2. python3 爬虫五大模块之四:网页解析器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  3. python3 爬虫五大模块之一:爬虫调度器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  4. python3 爬虫五大模块之五:信息采集器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. python爬虫模块之URL管理器模块

    URL管理器模块 一般是用来维护爬取的url和未爬取的url已经新添加的url的,如果队列中已经存在了当前爬取的url了就不需要再重复爬取了,另外防止造成一个死循环.举个例子 我爬www.baidu. ...

  7. Tkinter模块:Grid几何管理器

    Tkinter模块是Python的标准库模块之一,也是使用Python语言进行图形化用户界面(GUI)开发的基础. 本文介绍一下Tkinter模块的Grid几何管理器. 使用VB.MFC进行GUI开发 ...

  8. 第4章 URL管理器和实现方法

    URL管理器:管理待抓取URL集合和已抓取URL集合 -- 防止重复抓取.防止循环抓取 URL需要支持哪些功能: 添加新URL到待爬取集合中.判断待添加URL是否在容器中,判断是否还有待爬取URL,获 ...

  9. python3爬虫 url管理器

    import urllib.request #python3中将urllib2拆分为了urllib.request.urllib.error.urllib.response等 import http. ...

随机推荐

  1. mysql zip 安装

    第一步下载mysql.zip https://dev.mysql.com/downloads/mysql/5.7.html#downloads 第二步:解压文件后在其目录下, 新建   my.ini ...

  2. 【GCC编译器】计算支配树信息 Part1 - 求CFG的深度为主搜索树

    深度为主生成树:将图中所有的结点和那些构成深度为主次序的边表示为树的形式,并将其他的边(这些边不是深度为主次序的一部分)用一种有别于树的方式来表示(我们用虚线而不是实线表示它们) 属于深度为主生成树的 ...

  3. 【Android面试查漏补缺】之Handler详解,带你全面理解Handler消息机制

    在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一.题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQue ...

  4. .NET Core/.NET5/.NET6 开源项目汇总13:模板引擎

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  5. 第5篇-调用Java方法后弹出栈帧及处理返回结果

    在前一篇 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍了通过callq调用entry point,不过我们并没有看完generate_call_stub()函数的实现.接下来在ge ...

  6. [SQL]修改和删除基本表

    修改基本表 SQL语言用alter table语句修改基本表,其一般格式如下: alter table <表名> add <列名> <数据类型> [<列级完整 ...

  7. 修改Linux系统的默认语言编码集

    RedHat 今天晚上发现服务器上vi的界面提示变成了乱码,只能将XShell的编码改为GBK才能正常显示,导致consolas字体无法使用,GBK编码下的字体丑陋无比,无法忍受,一轮google之后 ...

  8. Java和Groovy脚本互相调用实例

    本实例是GODU动态脚本的一个技术简化版,演示了java调groovy,groovy又调java的运行过程. 测试用例: package com.boco.godu.integration; impo ...

  9. 你认为的.NET数据库连接池,真的是全部吗?

    一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象. DBA能在对业务方无侵 ...

  10. Git-03-工作区和暂存区

    工作区和暂存区的概念 工作区 工作区:就是电脑里能看到的目录,如现在学习的目录github 暂存区 版本库:工作区内有一个隐藏目录 .git,这个叫做版本库 git版本库中有一个重要的区叫做暂存区(i ...