我创建了一个使用 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)或者为什么我的服务器不响应?
好吧,我找到了解决问题的方法!其一:我没有注意到我在函数中写的是
vy
而不是 by
:div.find_element_by_tag_name
。
第二件事是使用 Apache 服务器。由于某种原因,使用 CGIHTTPServer 的 lite python 服务器无法工作。所以我使用 XAMPP 修改了 httpd.conf
文件,最后一件事是将路径 #!/Python27/python
添加到脚本中。
这可能在 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 中执行以下操作。这远非完美:
$ crontab -e
并添加行 * * * * * /path/to/run.sh
$ chmod +x 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
$ chmod 777 run1
)。#!/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"
#!/bin/bash
echo "Content-type: text/plain"
echo
echo > /path/to/run1
echo "Disabled"
$ 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 / 登录屏幕锁定生效,这是否会起作用。