Este artículo se basa en la descripción de la versión scrapy 2.6
prefacio
Después de medio mes de ajuste de parámetros, resolví algunas configuraciones de uso común y métodos de práctica en Scrapy (todas las lecciones de sangre y lágrimas TAT)
Instrucciones de configuración
configuración común settings.py
Se recomienda colocar la configuración global en esta ubicación, como la conexión a la base de datos, la clave secreta de terceros, la configuración de correo/webhook y otra información. No se recomienda colocar la configuración relacionada con Spider en este archivo.
Todas las arañas heredan BaseSpider, reescriba el constructor para inicializar la araña desde la configuración
Se recomienda poner la configuración relacionada con un solo Spider en custom_settings del Spider, como el número máximo de concurrencia, el número máximo de concurrencia de IP, si habilitar cookies y configuraciones adicionales, etc.
Todo SpiderMiddleware hereda de BaseSpiderMiddleware, DownloaderMiddleware hereda de BaseDownloaderMiddleware, reescribe el constructor para inicializar Middlewares desde la configuración
import signals
from utils import get_single_name
classBaseSpiderMiddleware:"""
基础爬虫中间件, 含settings参数的构造方法
"""def__init__(self, settings=None):
self.settings = settings
@classmethoddeffrom_crawler(cls, crawler):
s = cls(crawler.settings)
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s
defprocess_spider_input(self, response, spider):returnNonedefprocess_spider_output(self, response, result, spider):for i in result:yield i
defprocess_spider_exception(self, response, exception, spider):
spider.logger.warn('SpiderMiddleware %s, Spider %s, process exception: %s'%(get_single_name(self), spider.name, exception))defprocess_start_requests(self, start_requests, spider):for r in start_requests:yield r
defspider_opened(self, spider):
spider.logger.info('SpiderMiddleware %s, Spider opened: %s'%(get_single_name(self), spider.name))classBaseDownloaderMiddleware:"""
基础下载中间件, 含settings参数的构造方法
"""def__init__(self, settings=None):
self.settings = settings
@classmethoddeffrom_crawler(cls, crawler):
s = cls(crawler.settings)
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s
defprocess_request(self, request, spider):returnNonedefprocess_response(self, request, response, spider):return response
defprocess_exception(self, request, exception, spider):
spider.logger.warn('DownloadMiddleware %s, Spider %s, process exception: %s'%(get_single_name(self), spider.name, exception))defspider_opened(self, spider):
spider.logger.info('DownloadMiddleware: %s, Spider opened: %s'%(get_single_name(self), spider.name))
oleoductos.py
Todos los Pipelines heredan BasePipeline y reescriben el constructor para inicializar Pipeline desde la configuración
Es más fácil de administrar y mantener a través de la inicialización de la configuración de carga de Pipeline