python3 爬虫五大模块之二:URL管理器

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(): 往集合中添加一个元素

posted @ 2019-03-23 11:59  叨陪鲤  阅读(69)  评论(0编辑  收藏  举报