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)

原文地址:https://www.cnblogs.com/c-x-a/p/9174882.html

时间: 2024-10-13 14:48:06

python爬虫模块之URL管理器的相关文章

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

本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding:utf-8from com.wenhy.crawler_baidu_baike import url_manager, html_downloader, html_parser, html_outputer print "爬虫百度百科调度入口" # 创建爬虫类class SpiderMai

Python Tkinter模块 Grid布局管理器参数详解

在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同一个窗口中同时使用grid()和pack()!!). grid使用方法和主要参数: row=x,column=y:将控件放在x行,y列的位置.注意: 如果不指定参数,则默认从0开始. 此处的行号和列号并不是像在坐标轴上一样严格,只是代表一个上下左右的关系,如在行号"1"没有出现的情况下:

爬虫学习——URL管理器和实现方法

url管理器一共有三种实现方法,作为个人,我们应当选择哪种实现方法呢?答案就在下面 爬虫的简单架构 一.URL管理器 实现方式:有三种 1.内存中 python中set()可以直接去除重复的元素 2.关系数据库中 比如:mysql中的urls(url,is_crawled) 建立一个urls表包含两个字段url(待爬取)和is_crawled(已爬取). 3.缓存数据库 比如:redis 本身就包含set关系型数据结构 缓存数据库具有高性能:大公司首选 个人和小公司可用python内存作为存储,

python爬虫模块理解

Url管理器: 用来管理要抓取的url和已抓取的url,防止重复抓取和循环抓取,url管理器的五个最小功能: 1.添加url到容器中 2.获取一个url 3.判断url是否已在容器中 4.判断是否还有待爬取的url 5.将待爬取的url移到已爬取的url 网页下载器: 网页下载器是爬虫的核心组件,它将url对应的互联网网页已html的形式保存在本地.目前有两种网页下载器,1:urllib2(python基础模块) 2:requests(第三库) urllib2三种下载网页的方法: 1.简单方式下

python深入学习02 上下文管理器

上下文管理器(context manager)主要用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语法形式是with...as... 关闭文件 上下文管理器有个特别好的优点:可以在不使用文件的时候,自动关闭文件,节省了f.close()的步骤 上下文管理器有隶属于它的程序块.当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭).我们相当于使用缩进规定了文件对象f的

Python基础=== Tkinter Grid布局管理器详解

本文转自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html          @ 箬笠蓑衣 Grid(网格)布局管理器会将控件放置到一个二维的表格里.主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件. 注意:不要试图在一个主窗口中混合使用pack和grid (1)标签控件 1 from tkinter import * 2 3 tk=Tk() 4 #标签控件,显示文本和位图,展示在第一行 5 Label(tk,t

python小练习1 名片管理器

需要完成的基本功能:添加名片 删除名片 修改名片 查询名片 退出系统 思路:用字典作为名片存放个人信息,然后把名片存入列表中. cardList = [] # 列表,用于保存所有人名片,每个名片是一个字典. def menu(): # 用于提示用户功能选项 print('========名片管理器========') print('1添加名片 2删除名片 3修改名片 4查询名片 5显示全部 6退出系统 ') def addCard(): # 添加名片函数 card = {} # 局部变量,这个字

爬虫2 url管理器 url_manager.py

#coding:utf8 class UrlManager(object): def __init__(self): self.new_urls = set() self.old_urls = set() def add_new_url(self, url): if url is None: return if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) def add_new_url

python3爬虫 url管理器

import urllib.request #python3中将urllib2拆分为了urllib.request.urllib.error.urllib.response等 import http.cookiejar url = "http://www.baidu.com" print("第一种方法") response1 = urllib.request.urlopen(url) print(response1.getcode()) #打印response1的状