1. 程式人生 > >python爬蟲模塊之URL管理器

python爬蟲模塊之URL管理器

ini app 重要 但是 visit return 管理器 queue init

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管理器