我对网络抓取不熟悉,我正在 debian buster 和 firefox geckodriver 上使用 python 构建个人应用程序,如下所示,服务器在线
firefox_binary = FirefoxBinary('/usr/bin/firefox')
opts = FirefoxOptions()
opts.add_argument("--headless")
driver = webdriver.Firefox(options=opts, firefox_binary=firefox_binary)
driver.get(url)
我的目标是通过网页中的 ajax 调用来触发此应用程序,它是一个 nginx 服务器,因此在 php exec 命令中调用 py 脚本:
exec ('/usr/bin/python3 webdriver.py');
如果我登录 root 或其他用户,它在 debian 的命令行中工作正常。当我使用 Web 界面调用脚本时,用户是 www-data 并且遇到此错误:连接被拒绝(操作系统错误 111)
我已经在所有我能找到的互联网资源中搜索了三天,并尝试了所有我能做的,但目前还没有任何解决方案
您知道解决这个问题的方法吗?
编辑 :
硒版本 3.141.0
Mozilla 火狐 78.8.0esr
壁虎驱动程序 0.29
www-data 用户的 geckodriver.log(有错误):
- 1614703595351 geckodriver INFO 在 127.0.0.1:53899 上收听
- 1614703595556 mozrunner::runner INFO 运行命令:“/usr/bin/firefox”“--marionette”“--headless”“-foreground”“-no-remote”“-profile”“/tmp/rust_mozprofile22XajP”
- *** 您正在无头模式下运行。
管理员的 geckodriver.log (没有错误):
- 1614702846828 geckodriver INFO 在 127.0.0.1:46897 上收听
- 1614702847019 mozrunner::runner INFO 运行命令:“/usr/bin/firefox”“--marionette”“--headless”“-foreground”“-no-remote”“-profile”“/tmp/rust_mozprofile7jTA4y”
- *** 您正在无头模式下运行。
- 1614702859057 Marionette INFO 监听端口 45145
- 1614702859109 Marionette WARN 此会话将忽略 TLS 证书错误
- JavaScript 警告:https://........................js?v=1.2.7199.0,第 119 行:return 语句后无法访问代码
- JavaScript 警告:https://........................js?v=1.2.7199.0,第 119 行:return 语句后无法访问代码
- 1614702872140 Marionette 警告 TimedPromise 在 500 毫秒后超时:堆栈跟踪:
- TimedPromise/<@chrome://marionette/content/sync.js:245:13
- TimedPromise@chrome://marionette/content/sync.js:230:10
- Interaction.flushEventLoop@chrome://marionette/content/interaction.js:416:10 webdriverClickElement@chrome://marionette/content/interaction.js:182:31
- 1614702900530 Marionette INFO 已停止侦听端口 45145
geckodriver.log 用于 geckodriver 0.21 的 www-data :
1614706982655 geckodriver 信息 geckodriver 0.21.0
1614706982680 geckodriver INFO 在 127.0.0.1:33947 上收听
1614706983553 mozrunner::runner INFO 运行命令:“/usr/bin/firefox”“-marionette”“--headless”“-foreground”“-no-remote”“-profile”“/tmp/rust_mozprofile.p37a7r0syAmR”
*** 您正在无头模式下运行。
(firefox-esr:22409):dconf-CRITICAL **:17:44:03.845:无法创建目录“/var/www/.cache/dconf”:权限被拒绝。 dconf 将无法正常工作。
答案1
这是权限问题。 www-data 的主目录是 /var/www,通常由 root 拥有。
您可以将 /var/www 赋予 www-data,或者为了限制权限更改,您可以创建 /var/www/.mozilla 并将其所有权更改为 www-data。然后再次尝试运行您的脚本。
似乎正在发生的事情是 Firefox 试图保存用户首选项但失败了。它没有报告错误,也没有完全崩溃其主进程,但仍然受到足够的限制,无法与 geckodriver 进行通信。
答案2
是啊,效果很好,非常感谢
我刚刚创建了以下目录: /var/www/.cache /var/www/.mozilla
我授予 www-data 写入权限。
我想知道这是否没有安全问题。也许应该更好地在其他地方为 mozilla 指定一个工作目录..
答案3
主要问题是.cache
文件.mozilla
夹,它们需要权限。数据在执行脚本的用户的配置文件中生成。
这个解决方案对我有用:
- 确定需要保存缓存的用户。就我而言是
www-数据(的用户交响乐团)。我在文件夹里查了一下
/tmp/
。您可以看到文件夹的所有者,例如/tmp/Temp-276cddf8-d7c5-4a09...
这些文件夹是由 Firefox 生成的。 - 用户需要bash权限,所以你必须将文件
/etc/passwd
从 调整www-data:33:33:www-data:/usr/sbin:/usr/sbin/nologin
为www-data:x:33:33:www-data:**/var/www**:**/bin/bash**
- 在路径中创建文件夹,在我的例子中是
/var/www/
(该路径位于文件中指定的用户路径中/etc/passwd
)。
mkdir /var/www/.cache
mkdir /var/www/.mozilla
chown www-data:www-data .cache
chown www-data:www-data .mozilla
@sdragnev 回答正确,但就我而言,我仍然需要向用户授予 bash 权限。