Django rest framework + Scrapy [twisted.internet.error.ReactorNotRestartable]. (Flutter + Dart)
Я работаю над проектом, в котором Django API сочетается со Scrapy, идея состоит в том, чтобы запустить API с моего мобильного телефона, этот API запустит паука, а затем вернет всю информацию, которую я получу на свой мобильный телефон. Когда я выполняю поиск в первый раз на мобильном телефоне, все работает отлично, но когда я пытаюсь выполнить другой поиск, я получаю "twisted.internet.error.ReactorNotRestartable"
Вот мой API
class Prueba(APIView):
def post(self, request):
dato = request.data['dato']
if dato:
imprimir = self.execute(dato)
res = json.dumps([o.dump() for o in imprimir], indent=3)
return HttpResponse(res, content_type='application/json', status = status.HTTP_200_OK)
else:
return HttpResponse("NO", content_type='application/json')
def execute(self, peticion):
url = ['https://listado.mercadolibre.com.co/'+peticion]
url2 = ['https://www.olx.com.co/items/q-'+peticion]
process = CrawlerProcess({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'})
process.crawl(ProductoSpider, start_urls=url)
process.crawl(ProductoSpiderDos, start_urls=url2)
process.start()
return outputResponse #global variable in my spider
Вот один из моих пауков, я знаю, что он немного странный, но это потому, что я тестировал несколько вещей.
class ProductoSpiderDos(CrawlSpider):
name = 'olx'
item_count = 0
allowed_domain = ['www.olx.com.co']
def __init__(self, **kwargs):
super().__init__(**kwargs)
#//button[@data-aut-id="btnLoadMore"]
#//div[@class="JbJAl"]
rules = {
Rule(LinkExtractor(allow = (), restrict_xpaths = ('//button[@data-aut-id="btnLoadMore"]'))),
Rule(LinkExtractor(allow = (), restrict_xpaths = ('//li[@data-aut-id="itemBox"]/a')),
callback = "parse_item", follow = False),
}
def parse_item(self, response):
global outputResponse
lista = {}
agg = Producto()
agg.titulo = response.xpath('//h1[@class="_3rJ6e"]/text()').extract_first()
agg.urlimg = response.xpath('//img[@data-aut-id="defaultImg"]/@src').extract_first()
p = response.xpath('//span[@data-aut-id="itemPrice"]/text()').extract_first()
ch = ".$ "
for x in range(len(ch)):
p = p.replace(ch[x],"")
agg.precio = p
agg.url = response.request.url
lista['url'] = response.request.url
outputResponse.append(agg)
self.item_count += 1
if self.item_count > 3:
raise CloseSpider('item_exceeded')
yield lista
Не знаю, поможет ли это, но вот часть кода моего мобильного приложения (Flutter + Dart)
Когда я вызываю API
void buscar(BuildContext context) async {
List<Producto> ulist = [];
if (buscarController.text.isNotEmpty) {
var response = await http.post(
Uri.parse("http://192.168.1.3:8000/api/experimento"),
body: {'dato': buscarController.text});
if (response.statusCode == 200) {
var urjson = json.decode(response.body);
for (var jsondata in urjson) {
ulist.add(Producto.fromJson(jsondata));
}
} else {
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("Ha ocurrido un problema")));
}
}
setState(() {
productos = ulist;
});
}
В качестве теста я использую только две из данных, которые получаю от API
return Card(
child: Column(
children: [
Text(productos[index].titulo.toString()),
Text(productos[index].precio.toString())
],
),
);
Вот картинка, чтобы вы могли понять, что я хочу сделать. вот как это выглядит, когда я использую это в первый раз
