Tutorial de la parte superior del rastreador distribuido de Python

¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

escribir delante

Hay un título superior en el título, y de repente siento que este blog debería hacerse un poco más alto, ¿o lo siento por el título?

En el último blog, ya hemos configurado algunos entornos básicos que deben configurarse para la distribución distribuida. El siguiente paso es la operación práctica. Esta parte describirá el proceso lo más claramente posible. Como estoy operando el sistema operativo Windows, el Los pasos relevantes en el blog se describen en detalle. Las capturas de pantalla son para Windows.

Para la etapa de principiante del rastreador distribuido, comience con el rastreador simple scrapy.

scrapy rastrea el canal de descarga de CSDN

Para la comodidad de las pruebas, encontré un sitio web con reglas relativamente simples, el canal de descarga CSDN.Los https://download.csdn.net/datos correspondientes a este sitio web se pueden obtener continuamente https://download.csdn.net/home/get_more_latest_source?page=2modificando el valor de la página de parámetros en la URL, lo cual es muy considerado.

Crear un rastreador

Cree un rastreador básico a través de scrapy, == Acerca de cómo crear, este artículo no lo cubrirá, puede leer el artículo anterior ==, tenga en cuenta que debido a que tengo varios scrapy instalados en mi computadora, y este proyecto usa un entorno virtual, así que agregue scrapy a la ruta completa.

imagen.png

Después de crear el comando, puede ingresar a la etapa de codificación

inserte la descripción de la imagen aquí

Modificar configuración.py

Las modificaciones setting.pyson las siguientes, que son todas modificaciones muy básicas, y no hay necesidad de instrucciones especiales.

ROBOTSTXT_OBEY = False # 不遵守robots.txt 的规则
DOWNLOAD_DELAY = 3 # 下载器在从同一网站下载连续页面之前应等待的时间(以秒为单位)
DOWNLOADER_MIDDLEWARES = {
   'csdn_down_file.middlewares.CsdnDownFileDownloaderMiddleware': 543,
}
ITEM_PIPELINES = {
   'csdn_down_file.pipelines.CsdnDownFilePipeline': 300,
}

复制代码

Modificar middlewares.py

Modifique el middleware middlewares.pyy agregue los siguientes encabezados de solicitud al núcleo. Este lugar se puede manejar de manera más interesante. Muchos sitios web pueden engañar a los anti-rastreadores con las siguientes ideas. Al configurar el encabezado UA, puede configurarlo como un rastreador de motor de búsqueda UA , por ejemplo

  • BaiduMozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
  • Búsqueda 360Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);
  • GoogleMozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  • microsoft bing, bingMozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
  • tencent sosoSosospider+(+http://help.soso.com/webspider.htm)
  • Hay muchos más >>> Vaya a Baidu específicamente, este método de trampa y anti-rastreo tiene efectos peculiares en algunos sitios web
import random
class UserAgentDownloadMiddleware(object):
    # user-agent随机请求头中间件
    USER_AGENTS = [
        "百度搜索爬虫相应的UA头即可"
    ]
    def process_request(self, request, spider):
        user_agent = random.choice(self.USER_AGENT)
        request.headers['User-Agent'] = user_agent

复制代码

Modificar item.py

Modificación item.py, para reducir la cantidad de codificación en este blog, solo obtenemos 3 valores.

import scrapy
class CsdnDownFileItem(scrapy.Item):
    # define the fields for your item here like:
    file_id = scrapy.Field()
    title = scrapy.Field()
    source_url =scrapy.Field()
    pass
复制代码

Modificar csdn_down.py

Lo siguiente es la parte del código del rastreador central, que se puede escribir paso a paso, centrándose en modificar el csdn_donw.pyarchivo.inserte la descripción de la imagen aquí

import scrapy
from csdn_down_file.items import CsdnDownFileItem
import json


class CsdnDownSpider(scrapy.Spider):
    name = 'csdn_down'
    allowed_domains = ['download.csdn.net']
    start_urls = ['https://download.csdn.net/home/get_more_latest_source?page=1']

    def parse(self, response):
        rs =  json.loads(response.text)
        print(response.meta.get('page'))
        page = 2
        if response.meta.get('page') is not None:
            page = int(response.meta.get('page'))
            page += 1
        if rs.get('message') == 'ok':
            # 取出数据
            data = rs.get('data').get('list')
            # 存取数据
            for content in data:
                file_id = content.get('id')
                title = content.get('title')
                source_url = content.get('download_source_url')
                item = CsdnDownFileItem(
                    file_id=file_id,
                    title=title,
                    source_url=source_url
                )
                yield item

        next_url = f"https://download.csdn.net/home/get_more_latest_source?page={page}"
        yield scrapy.Request(url=next_url, callback = self.parse, meta = {'page': page})

复制代码

Modificar pipelines.py

Esta parte del código es relativamente simple de modificar. Los datos rastreados se almacenarán en un archivo JSON. No hay un límite superior establecido aquí, por lo que el rastreador no se detendrá solo. Si es necesario, agregue un número de página en línea. El final resultado es el siguiente.

from scrapy.exporters import JsonLinesItemExporter


class CsdnDownFilePipeline:
    def __init__(self):
        self.csdn = open('csdn.json', 'wb')

        self.csdn_exporter = JsonLinesItemExporter(
            self.csdn, ensure_ascii=False
        )

    def process_item(self, item, spider):
        self.csdn_exporter.export_item(item)
        return item

    def close_spider(self, item, spider):
        self.csdn.close()
复制代码

imagen.png

rastreador distribuido

redisLo siguiente que debe hacer es modificar el rastreador anterior como un rastreador distribuido, asegúrese de haber completado la instalación a través del blog anterior scrapy-redis, preste atención a los siguientes pasos

Modifique el archivo csdn_down.py del rastreador

  1. Cambie la clase del rastreador de scrapy.Spidera scrapy_redis.spiders.RedisSpider, o de , scrapy.CrawlSpidera scrapy_redis.spiders.RedisCrawlSpider, modifique esta parte como se muestra en la figura a continuación, preste atención a la relación de herencia de la clase
  2. start_urlsEliminar el rastreador . Agrega redis_key="csdn:urls"uno Esta redis_key se usa para controlar el inicio del rastreador en redis más adelante. La primera URL del rastreador se envía a través de este en redis.

    Tenga en cuenta que csdn:urls se refiere al nombre almacenado en la base de datos redis

    inserte la descripción de la imagen aquí

Modificar el archivo setting.py

El núcleo de esta parte es configurar redis e iniciar el almacenamiento redis

# ####################### redis配置文件 #######################

# 引入相关头文件
from scrapy_redis.scheduler import Scheduler
from scrapy_redis.pipelines import RedisPipeline

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 确保所有爬虫共享相同的去重指纹,也可以自定义自己的去重规则
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置redis为item pipeline
ITEM_PIPELINES = {
  'scrapy_redis.pipelines.RedisPipeline': 300
}
# 在redis中保持scrapy-redis用到的队列,不会清理redis中的队列,从而可以实现暂停和恢复的功能。
SCHEDULER_PERSIST = True

REDIS_HOST = '127.0.0.1' # 主机名
REDIS_PORT = 6379 # 端口
REDIS_ENCODING = "utf-8"

复制代码

iniciar redis

Consulte el blog anterior para obtener más detalles. Después de abrir, reinicie una línea de comando, conéctese a redis y escriba csdn:urlsel comportamiento del comando al mismo tiempo:lpush csdn:urls https://download.csdn.net/home/get_more_latest_source?page=1 inserte la descripción de la imagen aquí

Inicie su rastreador distribuido

Todo está listo, inicie su primer rastreador distribuido basado en redis. Tenga cuidado de no cerrar la consola del servidor redis durante la operación ~, los siguientes datos eventualmente se formarán en su redis

imagen.pngSi tiene varios servidores, puede implementar un rastreador distribuido básico organizando los programas del rastreador en secuencia.

escribir en la parte de atrás

Este blog comienza con el crawler más básico. Ojo con transformarlo en un crawler distribuido. Desde el nivel de comprensión se minimiza la dificultad. Bueno, la siguiente etapa es tuya, vamos.

Supongo que te gusta

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