Clase de rastreador 2022, use Scrapy+BloomFilter para escribir un rastreador incremental

Publique un artículo en la comunidad de Nuggets y agregue "Estoy participando en el "Plan de navegación de los Nuggets" en la primera oración del texto

escribir delante

Hoy es el 78.º blog de rastreadores de Python, configure una bandera aquí y esfuércese por terminar de escribir 100 casos de rastreadores antes del 1 de octubre. Si ve en el primer artículo, debe ser un codificador de rastreadores calificado, ¡siga adelante! !

Continúe obteniendo el rastreador incremental, este artículo involucra dos módulos de Python, uno es Scrapy y el otro es BloomFilter

Escenarios de uso de BloomFilter (filtro Bloom)

En cuanto a quién inventó BloomFilter y por qué, este artículo no entrará en detalles. A continuación, compartiremos principalmente con usted los escenarios en los que se utiliza BloomFilter.

  1. Aplicación de lista negra (lista negra de correo)
  2. Deduplicación del rastreador web (relacionado con el rastreador incremental que vamos a aprender)
  3. El sistema KV determina rápidamente si la clave existe
  4. Penetración de caché reducida

Una biblioteca que necesita ser dominada hoy es llamada pybloom_livesobre su código fuente. Para la última versión, consulte pypi.org/project/pyb…

Primero, vaya a github para verificar la biblioteca de dependencias. Este lugar es muy importante. Si no presta atención al seguimiento, es fácil anular github.com/joseph-fox/… Verifique la biblioteca de dependencias y tu necesitas unbitarray

inserte la descripción de la imagen aquí

Como no lo instalé al principio, se produjo el siguiente error. Preste atención para recordarnos que VC++ 14 no existe, pero instalarlo requiere muchos recursos. Podemos hacerlo de otras maneras.

inserte la descripción de la imagen aquí

Abrir https://www.lfd.uci.edu/~gohlke/pythonlibs/#bitarrayEncuentra la versión correspondiente de Python instalada localmente en tu computadora. Estoy usando la versión 3.7, solo descárgala. Hemos explicado la instalación de este contenido en el blog anterior.

inserte la descripción de la imagen aquí

paso uno:

inserte la descripción de la imagen aquí

Paso 2:

Instalarpybloom_live

inserte la descripción de la imagen aquí

pybloom_live Inicio rápido

pybloom_liveHay dos usos simples, BloomFilter de capacidad fija y ScalableBloomFilter escalable, para decirlo sin rodeos, es una expansión fija y dinámica.

El de arriba es el ladrillo que tiré (Baidu, todavía hay muchas instrucciones básicas)

A continuación, usamos la BloomFilterclase para operar un archivo para lograr la deduplicación. Tenga en cuenta aquí que la deduplicación BloomFilterse realiza leyendo y escribiendo archivos. Si escribe un rastreador multiproceso o multiproceso, debe agregar exclusión mutua y sincronización al usarlo. Las condiciones, así como BloomFilterlas operaciones de E/S de archivos, prestan atención a la escritura y lectura por lotes, de lo contrario, la eficiencia se verá muy afectada.

Declare un bloomcheck.pyarchivo de clase, escriba el siguiente código, la descripción del código se ha colocado en los comentarios.

from pybloom_live import BloomFilter
import os
import hashlib
class BloomCheck(object):
    def __init__(self):
        '''
        以下代码用于判断bf布隆文件是否存在,存在打开,不存在新建
        '''
        self.filename = 'bloomfilter.bf'
        is_exist = os.path.exists(self.filename)
        if is_exist:
            self.bf = BloomFilter.fromfile(open(self.filename, 'rb'))
        else:
            # capacity是必选参数,表示容量 error_rate是错误率
            self.bf = BloomFilter(capacity=100000000, error_rate=0.001)

    def process_item(self, data):
        data_encode_md5 = hashlib.md5(data.encode(encoding='utf-8')).hexdigest()
        if data_encode_md5 in self.bf:
            # 如果data存在,返回False
            return False

        else:
            # 如果data不存在,新增到bf文件中,返回True
            self.bf.add(data_encode_md5)
            return True

    def save_bloom_file(self):
        self.bf.tofile(open(self.filename, 'wb'))
复制代码

código rastreador scrapy

Para la parte básica del rastreador, solo se muestra la parte del código fuente del rastreador central. Para responseel análisis, el juicio básico aún se realiza primero. Si titleya existe bf文件(el archivo se crea dinámicamente mediante el código anterior), entonces no se agregará , de lo contrario, los datos serán iterados.

El código completo se cargará en el archivo adjunto y se puede descargar al final del artículo.

class IndexSpider(scrapy.Spider):
    name = 'index'
    allowed_domains = ['xz.aliyun.com']
    start_urls = ['http://xz.aliyun.com/']
    bf = BloomCheck()
    def parse(self, response):
        li_list = response.xpath("//a[@class='topic-title']")
        for li in li_list:
            de_item = DeItem()
            title = li.xpath("./text()").extract_first().strip()
            # 判断title是否在bf文件中,如果不在,返回新数据
            if self.bf.process_item(title):
                de_item['title'] = title
                de_item['url'] = "https://xz.aliyun.com" + li.xpath("./@href").extract_first()
                yield de_item
            else:
                print(f"--{title}--数据已经存在,不进行添加")

        # 保存数据
        self.bf.save_bloom_file()
复制代码

Configurar tareas programadas scrapy

Escriba un archivo por lotes run.bat y colóquelo en el mismo directorio que el programa rastreador. También se pueden
cambiar otros directorios. Tenga en cuenta que la siguiente ruta se puede cambiar a su propia ruta.

@echo off
rem
E:
cd E:\crawl100\demo78\de\de

scrapy crawl index
rem pause
exit
复制代码

Personalizar el programa de tareas programadas de Windows Busque "Programador de tareas" en "Herramientas administrativas" en "Panel de control" y abra Crear tarea básica. Después de iniciar el programa, seleccione la ubicación del archivo bat. Programe las tareas para prestar atención a la hora de la prueba.

inserte la descripción de la imagen aquí

Este lugar encontrará un blog relativamente detallado para usted, el contenido es relativamente simple y no lo repetiré: blog.csdn.net/Gpwner/arti…

escribir en la parte de atrás

El rastreador incremental de hoy está aquí, espero que este artículo pueda ayudarlo ~

Supongo que te gusta

Origin juejin.im/post/7146209736613068808
Recomendado
Clasificación