запуск scrapy из nodejs

#python #node.js #scrapy

#python #node.js #scrapy

Вопрос:

Я пытаюсь запустить скрипт scrapy из проекта node js. Когда я запускаю его через Python IDE, используя приведенную ниже команду, он работает нормально

python scrap.py

Когда скрипт выполняется из nodejs, он успешно завершается, но не показывает никаких ошибок и не генерирует выходной файл.

Scrap.py

 def main():
    try:       
        process = CrawlerProcess(get_project_settings())
        process.crawl('crawlim')        
        process.start()
        print ("executed")
        sys.stdout.flush()
    except:
        print ("error")
if __name__ == '__main__':
         main()
  

Файл узла

 let {PythonShell}=require('python-shell')
 PythonShell.run(path.join(__dirname, '/py/scrap.py'), options, function (err) {
  if (err) throw err;
  console.log('finished');
}); 
  

Комментарии:

1. Узлу удалось вызвать скрипт python, ошибка заключалась в запуске скрипта scray. В сообщении об ошибке говорится, что Spyder не может найти ‘crawlim’. Но когда я запускаю скрипт python напрямую, у него не возникает проблем. это происходит только при запуске с узла.

Ответ №1:

Использовать require('child_process').exec

 var exec = require('child_process').exec;
var path = require('path');

var file_path = path.join(__dirname, 'scrap.py');
exec('python '   file_path, function (error, stdout, stderr) 
{ 
    if(error){
        console.log(stderr);
    }else {
        console.log(stdout);
      }
});
  

Ответ №2:

Существуют разные способы написания скребка в зависимости от требований. Это также зависит от того, какие библиотеки использовались для получения данных (scrapy для обхода данных или selenium для отображения взаимодействия с браузером и извлечения требуемых данных). Исходя из моего личного опыта, мы смогли вызвать скрипт scraper (наш скрипт scraper использует библиотеки selenium и BeautifulSoup). Ниже показано, как мы выполнили скрипт с использованием дочернего процесса.

    const spawn = require("child_process").spawn;
   const pythonProcess = spawn('python',["./Scraper_script.py",p]);
  

Если вы используете scrapy spider для обхода данных, то этот подход не работает.