proceso de configuración dinámica scrapy [reptil] con más de reptiles, caso base

       Hay momentos en los que hay que subir para tomar los datos necesarios de múltiples sitios, como nos gustaría que se arrastra varios sitios de noticias, que se almacena en la base de datos con una tabla. Vamos a tener que ir a cada sitio de definir una clase de araña que? De hecho, no es necesario, se puede añadir o modificar las reglas que se arrastran por el mantenimiento de una tabla o un archivo de configuración de reglas de configuración de reglas, entonces no hay necesidad de cambiar el código de programa puede alcanzar más de un sitio web de rastreo de forma dinámica.

       Para ello, ya no podemos utilizar la parte delantera scrapy crawl testde este comando, necesitamos SPID Scrapy programación ejecutar

       Se puede proporcionar un uso scrapy núcleo API scrapy inicio mediante programación, en lugar del tradicional scrapy crawlmodo de puesta en marcha. Scrapy marco de la red asíncrona construido en la parte superior de la fundación trenzado, por lo que necesita para ejecutar el interior del reactor trenzado. En primer lugar, puede utilizar scrapy.crawler.CrawlerProcessesta clase para hacer funcionar su araña, esta clase se iniciará un reactor de Twisted para usted, y puede configurar su registro y el procesador de apagado. Todos los comandos Scrapy utilizan esta clase

        En primer lugar, modificaciones de código main.py archivo no puede excute la, utilice el código siguiente:

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl('maoyan')#爬虫名称
process.crawl('maoyan2')#爬虫名称
process.start() # the script will block here until the crawling is finished

         nos envió con el proceso de pruebas, modificar el código fuente de rastreo y marcado los parámetros.

         En primer lugar, crear una carpeta en el mismo directorio item.py, llamado mycmd. En segundo lugar, establecer un valor nulo en la carpeta hay un __init__.py archivo archivo de mycrawl.py, a continuación, copiar el código de abajo en él. Y luego COMMANDS_MODULE = '' en basicdemo.mycmd archivo setting.py, donde basicdemo es el nombre del proyecto, mycmd es el nombre de la carpeta

import os
from scrapy.commands import ScrapyCommand
from scrapy.utils.conf import arglist_to_dict
from scrapy.utils.python import without_none_values
from scrapy.exceptions import UsageError


class Command(ScrapyCommand):

    requires_project = True

    def syntax(self):
        return "[options] <spider>"

    def short_desc(self):
        return "Run a spider"

    def add_options(self, parser):
        ScrapyCommand.add_options(self, parser)
        parser.add_option("-a", dest="spargs", action="append", default=[], metavar="NAME=VALUE",
                          help="set spider argument (may be repeated)")
        parser.add_option("-o", "--output", metavar="FILE",
                          help="dump scraped items into FILE (use - for stdout)")
        parser.add_option("-t", "--output-format", metavar="FORMAT",
                          help="format to use for dumping items with -o")

    def process_options(self, args, opts):
        ScrapyCommand.process_options(self, args, opts)
        try:
            opts.spargs = arglist_to_dict(opts.spargs)
        except ValueError:
            raise UsageError("Invalid -a value, use -a NAME=VALUE", print_help=False)
        if opts.output:
            if opts.output == '-':
                self.settings.set('FEED_URI', 'stdout:', priority='cmdline')
            else:
                self.settings.set('FEED_URI', opts.output, priority='cmdline')
            feed_exporters = without_none_values(
                self.settings.getwithbase('FEED_EXPORTERS'))
            valid_output_formats = feed_exporters.keys()
            if not opts.output_format:
                opts.output_format = os.path.splitext(opts.output)[1].replace(".", "")
            if opts.output_format not in valid_output_formats:
                raise UsageError("Unrecognized output format '%s', set one"
                                 " using the '-t' switch or as a file extension"
                                 " from the supported list %s" % (opts.output_format,
                                                                  tuple(valid_output_formats)))
            self.settings.set('FEED_FORMAT', opts.output_format, priority='cmdline')

    def run(self, args, opts):
        # 获取爬虫列表
        spd_loader_list = self.crawler_process.spider_loader.list()
        # 遍历各爬虫
        for spname in spd_loader_list or args:
            self.crawler_process.crawl(spname, **opts.spargs)
            print("此时启动的爬虫:" + spname)
        self.crawler_process.start()

item.py archivo de conjunto

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join
import scrapy
class BasicdemoItem(scrapy.Item):
    title=scrapy.Field()
    article=scrapy.Field(
        default_output_processor=TakeFirst()
    )
class BasicdemoItem2(scrapy.Item):
    name=scrapy.Field()
    price=scrapy.Field()

documentos de archivo de conjunto de dos rastreadores tubería (no hay suficiente experiencia aquí terminó siendo sólo dos archivos de tubería, no se pueden unir, este último más esfuerzo), aquí es una base de datos de la memoria asíncrona

.py archivo tubería

import pymysql
# 使用twsited异步IO框架,实现数据的异步写入。
from pymysql import cursors
from twisted.enterprise import adbapi
class Basicdemo2Pipeline(object):
    def __init__(self):
        dbparams = {
            'host': 'localhost',
            'port': 3306,
            'user': 'root',
            'password': '',
            'database': 'test1',
            'charset': 'utf8',
            'cursorclass': cursors.DictCursor  # 指定cursor的类
        }
        self.db_pool = adbapi.ConnectionPool('pymysql', **dbparams)
        self._sql = None

    @property
    def sql(self):
        if not self._sql:
            self._sql = 'INSERT INTO boods(dd,ff) VALUES(%s,%s)'
            return self._sql
        return self._sql

    def process_item(self, item, spider):
        query = self.db_pool.runInteraction(self.insert_db,item)
        query.addErrback(self.handle_error, item, spider)
    def insert_db(self,cursor, item):
        for i in range(len(item['name'])) :
            values = (
                item['name'][i],
                item['price'][i],
            )
            print("Insert 成功了")
            cursor.execute(self.sql, values)
    def handle_error(self,error,item,spider):
        print('='*10 + "error" + '='*10)
        print(error)
        print('=' * 10 + "error" + '=' * 10)

class Basicdemo1Pipeline(object):
    def __init__(self):
        dbparams = {
            'host': 'localhost',
            'port': 3306,
            'user': 'root',
            'password': '',
            'database': 'test1',
            'charset': 'utf8',
            'cursorclass': cursors.DictCursor  # 指定cursor的类
        }
        self.db_pool = adbapi.ConnectionPool('pymysql', **dbparams)
        self._sql = None

    @property
    def sql(self):
        if not self._sql:
            self._sql = 'INSERT INTO boods(dd,ff) VALUES(%s,%s)'
            return self._sql
        return self._sql

    def process_item(self, item, spider):
        query = self.db_pool.runInteraction(self.insert_db,item)
        query.addErrback(self.handle_error, item, spider)
    def insert_db(self,cursor, item):
        for i in range(len(item['title'])) :
            values = (
                item['title'][i],
                item['article'][i],
            )
            print("Insert 成功了")
            cursor.execute(self.sql, values)
    def handle_error(self,error,item,spider):
        print('='*10 + "error" + '='*10)
        print(error)
        print('=' * 10 + "error" + '=' * 10)

Proporcionado setting.py archivo (en este caso contiene el código de añadir cmd frontal)

# -*- coding: utf-8 -*-

# Scrapy settings for basicdemo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'basicdemo'

SPIDER_MODULES = ['basicdemo.spiders']
NEWSPIDER_MODULE = 'basicdemo.spiders'
COMMANDS_MODULE = 'basicdemo.mycmd'

ROBOTSTXT_OBEY = True

ITEM_PIPELINES = {
    'basicdemo.pipelines.Basicdemo1Pipeline': 100,
    'basicdemo.pipelines.Basicdemo2Pipeline': 100,
}
LOG_LEVEL = 'ERROR'

Artículo en dos clases se proporciona en item.py

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join
import scrapy
class BasicdemoItem(scrapy.Item):
    title=scrapy.Field()
    article=scrapy.Field(
        default_output_processor=TakeFirst()
    )
class BasicdemoItem2(scrapy.Item):
    name=scrapy.Field()
    price=scrapy.Field()

Agregue el código siguiente para cada rastreador de archivos .py

   custom_settings = {
        'ITEM_PIPELINES': {'basicdemo.pipelines.Basicdemo2Pipeline': 100},
    }
Ejemplos específicos son los siguientes:
import scrapy
from scrapy.loader import ItemLoader
from basicdemo.items import BasicdemoItem2
class Maoyan2Spider(scrapy.Spider):
    name = 'maoyan2'
    #allowed_domains = ['www.yub2b.com/mall/']
    start_urls = ['http://www.yub2b.com/mall/']
    custom_settings = {
        'ITEM_PIPELINES': {'basicdemo.pipelines.Basicdemo2Pipeline': 100},
    }
    def parse(self, response):
        dl = response.css('.box_body .mthumb table tr td ul li a')
        item1Loader = ItemLoader(item=BasicdemoItem2(), response=response)
        item1Loader.add_css('name', '.box_body .mthumb table tr td ul li a::text')
        item1Loader.add_css('price', '.box_body .mthumb table tr td ul li span::text')
        print("输出在这里,爬虫1")
        yield item1Loader.load_item()

Aquí hay dos clases se pueden utilizar en el mismo proceso dos rastreadores.

La primera es CrawlerProcess, agregue el siguiente archivo de código main.py:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

# myspd1是爬虫名
process.crawl('maoyan')
process.crawl('maoyan2')

process.start()

La segunda clase es CrawlerRunner, agregue el siguiente archivo de código main.py:

import scrapy
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
runner = CrawlerRunner(get_project_settings())
# myspd1是爬虫名
runner.crawl('maoyan')
runner.crawl('maoyan2')
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()

 

Publicado 56 artículos originales · ganado elogios 2 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/fan13938409755/article/details/105005046
Recomendado
Clasificación