Python 中的 Selenium + Flask/Falcon - 502 错误网关错误

Thi*_*ago 7 python selenium falconframework

我正在使用 Selenium 使用Flask for Python在 API 端点内对网站进行无头抓取。我做了几次测试,我的 selenium 抓取代码在脚本中完美运行,并且在本地主机中作为 API 运行。但是,当我在远程服务器中部署代码时,请求总是返回502 Bad Gateway 错误。这很奇怪,因为通过日志记录,我可以看到抓取工作正常,但服务器在抓取完成处理之前以 502 响应,就好像它试图设置代理但失败一样。我还注意到,删除time.sleep代码中的 会使其返回 200,尽管结果可能是错误的,因为它没有给 selenium 适当的时间来加载所有要抓取的页面。

我还尝试设置使用 falcon 而不是flask,但出现了类似的错误。这是我最近使用Falcon 的代码示例:

class GetUrl(object):

    def on_get(self, req, resp):
        """
        Get Request
        :param req:
        :param resp:
        :return:
        """

        # read parameter
        req_body = req.bounded_stream.read()
        json_data = json.loads(req_body.decode('utf8'))
        url = json_data.get("url")

        # get the url
        options = Options()
        options.add_argument("--headless")
        driver = webdriver.Firefox(firefox_options=options)

        driver.get(url)
        time.sleep(5)
        result = False

        # check for outbound links
        content = driver.find_elements_by_xpath("//a[@class='_52c6']")
        if len(content) > 0:
            href = content[0].get_attribute("href")
            result = True

        driver.quit()

        # make the return
        return_doc = {"result": result}
        resp.body = json.dumps(return_doc, sort_keys=True, indent=2)
        resp.content_type = 'text/string'
        resp.append_header('Access-Control-Allow-Origin', "*")
        resp.status = falcon.HTTP_200
Run Code Online (Sandbox Code Playgroud)

我看到了一些其他类似的问题,但即使我可以看到gunicorn我的服务器中正在运行,但我没有 nginx,或者至少它没有在应该运行的地方运行。而且我认为 Falcon 不会使用它。那么,我究竟做错了什么?非常感谢本期的一些亮点,谢谢!

Ori*_*PhD 1

你错过了一些imports

from IPython.display import clear_output
import time as time
import json
!apt-get update
!apt install chromium-chromedriver
!which chromedriver
!pip install selenium
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.expected_conditions import presence_of_element_located
!pip install page_objects
import page_objects
from page_objects import PageObject, PageElement
time.sleep(1)
clear_output()

class GetUrl(object):

    def on_get(self, req, resp):
        """
        Get Request
        :param req:
        :param resp:
        :return:
        """

        # read parameter
        req_body = req.bounded_stream.read()
        json_data = json.loads(req_body.decode('utf8'))
        url = json_data.get("/sf/ask/4832727091/#69546175")

        # get the url
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        driver = webdriver.Chrome('chromedriver',options = options)
        driver.implicitly_wait(3)

        driver.get("/sf/ask/4832727091/#69546175")
        result = False

        # check for outbound links
        contentStorage = []
        content = driver.find_elements_by_tag_name('a')
        for i in content:
            contentStorage.append(i.get_attribute('text'))
            result = True

        #driver.quit()

        # make the return
        return_doc = {"result": result}
        resp.body = json.dumps(return_doc, sort_keys=True, indent=2)
        resp.content_type = 'text/string'
        resp.append_header('Access-Control-Allow-Origin', "*")
        resp.status = falcon.HTTP_200
Run Code Online (Sandbox Code Playgroud)