如何从Ktor运行Python脚本(Scrapy)

hpxqektj  于 2022-11-09  发布在  Python
关注(0)|答案(1)|浏览(129)

"我想做的是“

  1. Android应用程序(ADMIN),从用户获取作业标题,并使用Scrapy(Python)获取所有与之相关的作业,通过API将其保存到数据库。
  2. Android应用程序(CLIENT),通过API从数据库中获取所有数据。

**问题:**我在如何将我的python脚本与Ktor连接上遇到了麻烦。
一些代码,以便更清楚地说明:

import spiders.Linkedin as linkedinSpider

linkedinSpider.main(numberOfPages=1, keywords="ios developer", location="US")

这段代码运行良好,帮助我获取数据并将其存储到数据库中,如果保存成功,则返回True,否则返回False。我只需要调用此函数,所有的工作都为我完成。
同样地,
这是我如何从用户通过API从管理员端使用KTOR获得数据。这也工作得很好。

// Fetchs New Jobs.
            get("/fetch") {
                val numberOfPages = call.request.queryParameters["pages"]?.toInt() ?: 1
                val keyword = call.request.queryParameters["keyword"]
                val location = call.request.queryParameters["location"]

                if (numberOfPages < 1) {
                    call.respond(
                        status = HttpStatusCode.BadRequest,
                        message = Message(message = "Incorrect Page Number.")
                    )
                } else {
                    call.respond(
                        status = HttpStatusCode.PK,
                        message = Message(message = "Process Completed.")
                    )
                }
            }

这就是我希望代码逻辑工作的方式。

// Fetch New Jobs.
            get("/fetch") {
                val numberOfPages = call.request.queryParameters["pages"]?.toInt() ?: 1
                val keyword = call.request.queryParameters["keyword"]
                val location = call.request.queryParameters["location"]

                if (numberOfPages < 1) {
                    call.respond(
                        status = HttpStatusCode.BadRequest,
                        message = Message(message = "Incorrect Page Number.")
                    )
                } else {

                    // TODO: Call Python Function Here and Check the Return Type. Something Like This.
                    if(linkedinSpider.main(numberOfPages=numberOfPages, keywords=keyword, location=location)) {
                        call.respond(
                            status = HttpStatusCode.OK,
                            message = Message(message = "Process Completed.")
                        )
                    } else {
                        call.respond(
                            status = HttpStatusCode.InternalServerError,
                            message = Message(message = "Something Went Wrong.")
                        )
                    }
                }
            }

另外,这是两个不同的单独项目。我需要合并它们吗?当我尝试时,它说没有python解释器在intelliJ中找到,我正在使用它作为Ktor Development的IDE。我还尝试配置python解释器,但似乎没有用,因为它不能引用变量或python文件。

编辑1

"这就是我的努力"

val processBuilder = ProcessBuilder(
        "python3", "main.py"
    )

    val exitCode = processBuilder.start().waitFor()

    if (exitCode == 0) {
        println("Process Completed.")
    } else {
        println("Something Went Wrong.")
    }
}

我得到的exitCode是2。但是当我运行下面的代码时,它与exitCode0一起工作。

ProcessBuilder("python3", "--version")

编辑2
在此之后,代码工作但不终止,我没有得到输出

这是我为模拟问题而创建的Kotlin文件。

package com.bhardwaj.routes

import java.io.File

fun main() {
    val processBuilder = ProcessBuilder(
        "python3", "main.py", "1", "android", "india"
    )
    processBuilder.directory(File("src/main/kotlin/com/bhardwaj/"))
    val process = processBuilder.start()
    val exitCode = process.waitFor()

    if (exitCode == 0) {
        val output = String(process.inputStream.readBytes())
        print("Process Completed -> $output")
    } else {
        val output = String(process.errorStream.readBytes())
        print("Something went wrong -> $output")
    }
}

如果我在终端运行相同的命令,它的工作.

python3 src/main/kotlin/com/bhardwaj/main.py 1 "android" "india"

在终端中运行相同的命令后,输出为-〉

编辑3

当我停止默认的Scrapy日志记录时,代码工作了。似乎在Process Builder中对输出流有一些限制。下面是我所做的。

def __init__(self, number_of_pages=1, keywords="", location="",**kwargs):
        super().__init__(**kwargs)
        logging.getLogger('scrapy').setLevel(logging.WARNING)

这在开发模式下运行得很完美。但是我还有一些事情要讨论。当我在Heroku上部署了同样的东西,并发出了一个get请求,30-40秒后,我得到了503服务不可用。但是又过了20-30秒,我把数据导入了数据库。这似乎让人很困惑为什么会发生这种情况。

为了程序的流程和清晰度-当我向ktor发出get请求时,它请求Scrappy(一个python程序)来抓取数据并将其存储在JSON文件中。在所有过程完成后,它向另一个端点发出请求,将所有数据存储到数据库中,在所有这些操作完成后,它将返回特定的状态代码,并使用call.respond作为输出响应用户在克托

这个问题是由于python程序向端点发出的另一个请求引起的,还是与我们一次只能处理一个进程的heroku有关。因为开发模式(即localhost url)没有问题

mspsb9vt

mspsb9vt1#

当我停止默认的Scrapy日志记录时,代码工作了。似乎在Process Builder中对输出流有一些限制。下面是我所做的。

def __init__(self,**kwargs):
    super().__init__(**kwargs)
    logging.getLogger('scrapy').setLevel(logging.WARNING)

相关问题