从Flask应用程序运行scrapy

时间:2015-08-17 07:05:53

标签: python nginx flask scrapy scrapy-spider

我有一个爬虫,我希望每次有人进入链接时都会运行它。由于所有其他模块都在Flask中,我被告知要在Flask中构建它。我已经在虚拟环境中安装了scrapy和selenium,并在root用户机器上全局安装了scrapy和selen。

当我通过终端运行爬虫时,一切正常。当我启动Flask应用程序并在浏览器中访问xx.xx.xx.xx:8080/whats时,这也可以正常运行我的抓取工具并获取文件。但是一旦我上线,所以当一个人进入链接时,它会在浏览器中给我内部错误。

为了运行抓取工具,我们必须输入" scrapy crawl whateverthespidernameis"在终端。我是使用Python的os模块完成的。

这是我的烧瓶代码:

import sys
from flask import request, jsonify, render_template, url_for, redirect,   session, abort,render_template_string,send_file,send_from_directory
from flask import *
#from application1 import *
from main import *
from test123 import *
import os
app = Flask(__name__)

filename = ''
app = Flask(__name__)

@app.route('/whats')
def whats():
    os.getcwd()
    os.chdir("/var/www/myapp/whats")
    //cmd = "scrapy crawl whats"
    cmd = "sudo scrapy crawl whats"
    os.system(cmd)
    return send_file("/var/www/myapp/staticcsv/whats.csv", as_attachment =True)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080,debug=True)

这是我在实时链接中运行时记录在日志文件中的错误:

sh: 1: scrapy: not found**

这是我在命令中使用sudo时记录在日志文件中的错误(变量cmd):

sudo: no tty present and no askpass program specified**

我正在使用uwsgi和nginx。

如何运行此抓取工具,以便当有人进入" xx.xx.xx.xx / whats"爬虫运行并返回csv文件?

1 个答案:

答案 0 :(得分:1)

当您使用sudo shell时,它会在tty上请求密码 - 它特别不会读取此信息的标准输入。由于flask和其他Web应用程序通常从终端分离运行,sudo无法请求密码,因此它会查找可以提供密码的程序。您可以在this answer中找到有关此主题的更多信息。

您未找到scrapy的原因很可能是因为您在测试中使用的交互式shell与正在运行的进程$PATH之间的flask存在差异。解决这个问题的最简单方法是在命令中提供scrapy程序的完整路径。