【问题标题】:Run scrapy from Flask application从 Flask 应用程序运行 scrapy
【发布时间】:2015-08-17 07:05:52
【问题描述】:

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

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

为了运行爬虫,我们必须在终端中输入“scrapy crawlwhatthespidernameis”。我使用 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 文件?

【问题讨论】:

  • 你的代码真的有cmd = "sudo crapy crawl whats"这一行吗(注意调用了一个名为crapy的程序)?
  • 你正在使用 python os 命令' cmd = "sudo crapy crawl whats" '。我认为应该是' cmd = "sudo scrapy crawl whats" '。下一点是检查你的scrapy PATH,纠正它。它将运行没有任何错误。 :)
  • 感谢您指出帖子中的错误,我已经编辑了
  • 我在这里回答了类似的问题:stackoverflow.com/questions/36384286/…

标签: python nginx flask scrapy scrapy-spider


【解决方案1】:

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

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

【讨论】:

  • 请注意,这种情况的一个潜在原因是您的 virtualenv 在开发过程中处于活动状态,但在部署的版本中未激活。
  • “shell this starts”是什么意思?
  • 我会尝试给出完整的路径,看看是否可行
  • @holdenweb 谢谢它就像一个魅力,编写爬虫和代码几乎花了我 3 到 4 个小时。从 2 天开始,我就一直坚持让它上线。我不敢相信添加完整路径并没有让我感到震惊。除此之外,“flask 和其他 Web 应用程序通常独立于终端运行”
  • “shell this starts”是指运行sudo 命令的子shell - 必须使用子shell,因为它需要具有不同的进程环境。很高兴你解决了你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2018-02-01
  • 2022-01-15
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多