从 Python CGI 脚本运行 Selenium Webdriver

问题描述 投票:0回答:2

我创建了一个使用 Selenium webdriver 来废弃网站的 python 脚本。现在我尝试使用 CGI 从网络运行此脚本。 因此,为了确保我的 CGI 服务器正常工作,我尝试了以下方法:

import cgi
print 'Content-Type: text/html'
print
list_brand = ['VOLVO','FIAT', 'BMW']
print '<h1>TESTING CGI</h1>'
print '<form>'
print '<select>'
for i in range(3):
      print '<option value="' + list_brand[i] + '">'+ list_brand[i] +'</option>'
print '</select>'
print '</form>'

效果很好。现在,当我使用 Selenium 和 CGI 使用此脚本时:

import cgitb
import cgi
from selenium import webdriver

print 'Content-Type: text/html'
print
cgitb.enable(display=0, logdir="C:/path/to/log/directory")
path_to_pjs = 'C:path/to/phantomjs-2.1.1-windows/bin/phantomjs.exe'
browser = webdriver.PhantomJS(executable_path = path_to_pjs)
#Reaching to URL
url = 'http://www.website.fr/cl/2/products'
browser.get(url)
div_set = browser.find_elements_by_class_name('productname')
print '<form>'
print '<select>'
for div in div_set:
      print '<option value="' + div.find_element_vy_tag_name('h3').text + '">'+ div.find_element_vy_tag_name('h3').text +'</option>'
print '</select>'
print '</form>'

页面不断加载但没有响应。知道这是否可能(我的意思是从 cgi 脚本运行 selenium)或者为什么我的服务器不响应?

python selenium-webdriver cgi
2个回答
0
投票

好吧,我找到了解决问题的方法!其一:我没有注意到我在函数中写的是

vy
而不是
by
div.find_element_by_tag_name
。 第二件事是使用 Apache 服务器。由于某种原因,使用 CGIHTTPServer 的 lite python 服务器无法工作。所以我使用 XAMPP 修改了
httpd.conf
文件,最后一件事是将路径
#!/Python27/python
添加到脚本中。


0
投票

这可能在 2017 年有效,但在 2024 年,Apache HTTP Server 不允许 CGI/www-data 导入 selenium。使用这个 CGI 脚本

#!/usr/bin/env python3
import cgi
#from selenium import webdriver
#import selenium
print("Content-type: text/plain")
print()
print("webserver test")

取消注释“from selenium import webdriver”或“import selenium”将导致 HTTP 500 内部服务器错误。没有错误:

$ python3 -c "import selenium;from selenium import webdriver;print('test bash')"

现在的解决方案是在 GNU/Linux 中执行以下操作。这远非完美:

  1. 运行
    $ crontab -e
    并添加行
    * * * * * /path/to/run.sh
  2. 文件 run.sh 设置为可执行文件(运行
    $ chmod +x run.sh
  3. “run.sh”的内容:
#!/usr/bin/env bash
export DISPLAY=:0
if [[ $(cat /path/to/run1) == "Yes do it" ]]; then
    python3 -c "from selenium import webdriver;options=webdriver.ChromeOptions();options.binary_location=\"/usr/bin/brave-browser\";driver=webdriver.Chrome(options=options);driver.get(\"$(cat /path/to/run2)\");"
fi
  1. 将“/path/to/run1”和“/path/to/run2”替换为您拥有的空文本文件的实际路径。他们应该拥有 777 权限或类似权限 (
    $ chmod 777 run1
    )。
  2. 在“/usr/lib/cgi-bin/”中创建这两个文件:urlon.sh 和 urloff.sh
  3. “urlon.sh”的内容(设置为可执行文件):
#!/bin/bash
echo "Content-type: text/plain"
echo
url="$(echo -n "$REQUEST_URI" | sed "s/.*?url=//g")"
echo "Yes do it" > /path/to/run1
echo "$url" > /path/to/run2
echo "URL: $url"
  1. “urloff.sh”的内容(设置为可执行文件):
#!/bin/bash
echo "Content-type: text/plain"
echo
echo > /path/to/run1
echo "Disabled"
  1. 用法:
    $ curl -kL https://10.0.0.199/cgi-bin/urlon.sh?url=https://example.com
    =“URL:https://example.com”和
    $ curl -kL https://10.0.0.199/cgi-bin/urloff.sh
    =“禁用”。请记住禁用它,这样它就不会每分钟都继续运行。另外,不确定如果 XSreenSaver / 登录屏幕锁定生效,这是否会起作用。
© www.soinside.com 2019 - 2024. All rights reserved.