scrapy 错误扭曲,互联网,错误,React器不可重新启动

57hvy0tb  于 2022-11-23  发布在  React
关注(0)|答案(1)|浏览(140)

刮伤后我再运行Scrapy遇到了问题。
例如,当我运行FastAPI并让Scrapy进行一次擦除时,它会正常工作,并为我提供正确的数据。但是,如果我尝试在不重新启动应用程序的情况下进行另一次擦除,我会得到错误“twisted.internet.error. ReactorNotRestartable”。
我试过几种解决办法,但都没有成功,或者我用错了。
我希望用户可以自由地做几次扫描,而不必每次都杀死应用程序并再次提升它。
如果你能帮我,我会很感激的。

from fastapi import FastAPI
from scrapy.crawler import CrawlerProcess
from server.lib.ProdsWeg.ProdsWeg.spiders.produtosWeg import CatalogoSpider
from server.lib.ProdsWeg.ProdsWeg.spiders.ServerMongo import ConectMongo
from fastapi import Response
import os
import json
import random
from server.lib.ProdsWeg.ProdsWeg.spiders.produtosWeg import recebeTermo

app = FastAPI()

## função para verificar se determinada variavel string é vazia ou não
def is_not_blank(termoss):
    return bool(termoss and not termoss.isspace())

@app.get("/", tags=['Início'])
def inicio():
    return {"Bem Vindo ao FastAPI+Scrapy v-1.0"}

@app.get("/Produtos", tags=["Raspagem de Dados"])
async def raspagem_produtos(produto: str):

    ##passando o termo para dentro da função localizada dentro do arquivo da spider, para ativar o browser da URL
    recebeTermo(produto)

    if os.path.exists("DadosScrapingProdutos.js"):
        os.remove("DadosScrapingProdutos.js")
        print('Arquivo já existe, removendo ele para a criação do novo JSON!')
    else:
        print("O arquivo não existe, criando um novo JSON!")

    custom_settings = {
    'FEED_URI': 'DadosScrapingProdutos.js',
    'FEED_FORMAT': 'json',
    'FEED_EXPORT_ENCODING': 'utf-8'
    }
    process = CrawlerProcess(settings=custom_settings)
    process.crawl(CatalogoSpider)
    process.start()

    if is_not_blank(produto)==True:
        ConectMongo.DbMongoJsonProds(produto)
    else:
        produto = str(random.randint(10, 1000))
        ConectMongo.DbMongoJsonProds(produto)

    f = open("DadosScrapingProdutos.js")
    d = json.load(f)
    json_str = json.dumps(d, indent=4, sort_keys=True, default=str)    
    return Response(json_str, media_type='application/json')
j1dl9f46

j1dl9f461#

伙计们,我设法解决了我的问题。按照@Alexandre在上面的注解中的建议,我在代码中实现了子进程。
我没有使用CrawlerProcess,而是使用了subprocess.call(),它会一直等待到操作结束。将执行Scrapy的命令传递给call(),同时传递一个参数'-a),以将补充搜索URL的术语传递给Spider类。我还通知'cwd',这是将执行命令的当前工作目录。
下面是文件FastAPI --〉app.py

from fastapi import FastAPI
from server.lib.Prods.Prods.spiders.ServerMongo import ConectMongo
from fastapi import Response
import os
import json
import random
import subprocess

app = FastAPI()

def is_not_blank(termoss):
    return bool(termoss and not termoss.isspace())

@app.get("/", tags=['Início'])
def inicio():
    return {"Bem Vindo ao FastAPI+Scrapy v-1.0"}

@app.get("/Produtos", tags=["Raspagem de Dados"])
async def raspagem_produtos(produto: str): 

    ## aqui fiz um procedimento de verificar se o JSON já existe, e se existir eu excluo ele, para evitar que o arquivo contenha as informações da ultima raspagem
    if os.path.exists("./app/server/lib/Prods/Prods/DadosScrapingProdutos.js"):
        os.remove("./app/server/lib/Prods/Prods/DadosScrapingProdutos.js")
        print('Arquivo já existe, removendo ele para a criação do novo JSON!')
    else:
        print("O arquivo não existe, criando um novo JSON!")

    subprocess.call([f'scrapy crawl produtos -a produto='+produto+''], shell = True, cwd='./app/server/lib/Prods/Prods')

    if is_not_blank(produto)==True:
        ConectMongo.DbMongoJsonProds(produto)
    else:
        produto = str(random.randint(10, 1000))
        ConectMongo.DbMongoJsonProds(produto)

    ## Nesta parte, é feito a leitura do JSON e adequação para que retorne os dados para a API de forma organizada e estruturada
    f = open("./app/server/lib/Prods/Prods/DadosScrapingProdutos.js")
    d = json.load(f)
    json_str = json.dumps(d, indent=4, sort_keys=True, default=str)    
    return Response(json_str, media_type='application/json')

在spider文件中,我必须示例化init函数,才能将用户在FastAPI中输入的术语带到这里。Scrapy文档对此进行了更深入的解释:[在spider文件中,我必须示例化init函数,才能将用户在FastAPI中输入的术语带到这里。Scrapy文档对此进行了更深入的解释:[1][2][3][4][5][6]
下面的文件剪贴--〉produtos.py--〉蜘蛛名称= 'produtos'

class CatalogoSpider(scrapy.Spider):
    name = 'produtos'
    custom_settings = {
    'FEED_URI': 'DadosScrapingProdutos.js',
    'FEED_FORMAT': 'json',
    'FEED_EXPORT_ENCODING': 'utf-8'
    }

    def __init__(self, produto='', *args, **kwargs):
        super(CatalogoSpider, self).__init__(*args, **kwargs)
        self.produto = produto

  [1]: https://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

通过这种方式,我可以上传FastAPI应用程序,并根据用户需要执行任意多的刮擦。

相关问题