#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 для обхода данных, то этот подход не работает.