16

我正在抓取一些似乎对它有很好保护的网站。我可以让它工作的唯一方法是使用 Selenium 加载页面,然后从中刮掉东西。

目前这适用于我的本地计算机(当我访问我的页面时会打开和关闭一个 Firefox 窗口,并且它的 HTML 在我的脚本中进一步处理)。但是,我需要我的刮刀可以在网络上访问。刮板嵌入在 Heroku 上的 Flask 应用程序中。有没有办法让 Selenium 浏览器在 Heroku 服务器上运行?或者有没有可以工作的托管服务提供商?

4

2 回答 2

17

Heroku,虽然很棒,但有一个主要限制,即不能使用自定义软件,或者在许多情况下,不能使用库。在提供易于使用、集中控制、托管的堆栈时,Heroku 剥离了他们的服务器以防止其他用途。

这归结为 Heroku dyno 上没有 Xorg。缺乏 Xorg 和缺乏安装自定义软件的能力意味着没有 xvfb,也没有能力运行 selenium 期望存在的浏览器。此外,浏览器通常不可用。

使用像 AWS 这样的云产品会带来更好的运气,您可以在其中安装自定义软件,包括 firefox、xvfb(以避免需要所有 Xorg 开销),当然还有其余的抓取堆栈。这个答案解释了如何正确地做到这一点。

于 2013-09-03T23:41:23.830 回答
7

有一些 buildpack 可以让 selenium 在 heroku 上工作。

在下面添加构建包。

1) heroku buildpacks:add https://github.com/kevinsawicki/heroku-buildpack-xvfb-google-chrome/
2) heroku buildpacks:add https://github.com/heroku/heroku-buildpack-chromedriver

并将 heroku 堆栈设置为 cedar-14,如下所示,因为 xvfb buildpack 仅适用于 cedar-14。

heroku stack:set cedar-14 -a stocksdata

然后将谷歌浏览器位置指向如下

options = ChromeOptions()
options.binary_location = "/app/.apt/usr/bin/google-chrome-stable"
driver = webdriver.Chrome(chrome_options=options)
于 2017-11-11T10:12:09.287 回答