python爬虫模块之URL管理器

Posted 一起来学python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫模块之URL管理器相关的知识,希望对你有一定的参考价值。

URL管理器模块

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

我爬www.baidu.com 其中我抓取的列表中有music.baidu.om,然后我再继续抓取该页面的所有链接,但是其中含有www.baidu.com,可以想象如果不做处理的话就成了一个死循环了,在百度首页和百度音乐页循环,所以有一个对列来维护URL是很重要的。

下面以python代码实现为例,使用的deque双向队列方便取出以前的url。

from collections import deque
class URLQueue():
    def __init__(self):
        self.queue = deque()  # 待抓取的网页
        self.visited = set()  # 已经抓取过的网页

    def new_url_size(self):
        ‘‘‘‘‘ 
        获取未爬取URL集合的大小 
        :return:  
        ‘‘‘
        return len(self.queue)

    def old_url_size(self):
        ‘‘‘‘‘ 
        获取已爬取URL的大小 
        :return:  
        ‘‘‘
        return len(self.visited)

    def has_new_url(self):
        ‘‘‘‘‘ 
        判断是否有未爬取的URL 
        :return:  
        ‘‘‘
        return self.new_url_size() != 0

    def get_new_url(self):
        ‘‘‘‘‘ 
        获取一个未爬取的URL 
        :return:  
        ‘‘‘
        new_url = self.queue.popleft()#从左侧取出一个链接
        self.old_urls.add(new_url)#记录已经抓取
        return new_url

    def add_new_url(self, url):
        ‘‘‘‘‘ 
        将新的URL添加到未爬取的URL集合 
        :param url: 单个url 
        :return:  
        ‘‘‘
        if url is None:
            return False
        if url not in self.new_urls and url not in self.old_urls:
            self.new_urls.append(url)

    def add_new_urls(self, urlset):
        ‘‘‘‘‘ 
        将新的URL添加到未爬取的URL集合 
        :param urlset: url集合
        :return:  
        ‘‘‘
        if urlset is None or len(urlset) == 0:
            return
        for url in urlset:
             self.add_new_url(url)
 
 

以上是关于python爬虫模块之URL管理器的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫模块理解

python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用b(

python——爬取图片(shutter图片网)

python之爬虫学习记录与心得

Python基础爬虫

python-爬虫之urllib模块