python - 从 Flask 应用程序运行 scrapy

标签 python nginx flask scrapy

我有一个爬虫程序,我想在每次有人访问该链接时运行它。由于所有其他模块都在 Flask 中,我被告知也要在 Flask 中构建它。我已经在虚拟环境中以及在具有 root 权限的机器上全局安装了 scrapy 和 selenium。

当我通过终端运行爬虫时,一切正常。当我启动 Flask 应用程序并在浏览器中访问 xx.xx.xx.xx:8080/whats 时,这也能正常运行并运行我的爬虫并获取文件。但是一旦我上线,任何时候有人访问链接,它就会在浏览器中出现内部错误。

为了运行爬虫,我们必须在终端中输入“scrapy crawl whateverthespidernameis”。我使用 Python 的 os 模块完成了这项工作。

这是我的 flask 代码:

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**

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

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

我正在使用 uwsgi 和 nginx。

我如何运行这个爬虫,以便当任何人访问“xx.xx.xx.xx/whats”时爬虫运行并返回 csv 文件?

最佳答案

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

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

关于python - 从 Flask 应用程序运行 scrapy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32044530/

相关文章:

python - 使用 south (django) 和 MySQL 进行模式迁移

python - manage.py syncdb 不为某些模型添加表

http - 是否可以更改 nginx 中 proxy_pass 网关关闭时返回的 HTTP 状态代码?

python - psycopg2.ThreadConnectionPool、uWSGI 和 Flask 的并发问题

flask - SQLALchemy-Utils : Use '~' operator with LTree

python - 在 Google App Engine 上使用 flask-login

python - Pandas 数据帧索引的 itertools.permutations 使用了太多内存

python - TruncatedSVD 返回不正确的尺寸

django - 为 Django 应用程序添加安全 header 的最佳做法是什么?

linux - 从 bash 脚本安装 nginx 模块不起作用