我正在抓取一些似乎对它有很好保护的网站。我可以让它工作的唯一方法是使用 Selenium 加载页面,然后从中刮掉东西。
目前这适用于我的本地计算机(当我访问我的页面时会打开和关闭一个 Firefox 窗口,并且它的 HTML 在我的脚本中进一步处理)。但是,我需要我的刮刀可以在网络上访问。刮板嵌入在 Heroku 上的 Flask 应用程序中。有没有办法让 Selenium 浏览器在 Heroku 服务器上运行?或者有没有可以工作的托管服务提供商?
我正在抓取一些似乎对它有很好保护的网站。我可以让它工作的唯一方法是使用 Selenium 加载页面,然后从中刮掉东西。
目前这适用于我的本地计算机(当我访问我的页面时会打开和关闭一个 Firefox 窗口,并且它的 HTML 在我的脚本中进一步处理)。但是,我需要我的刮刀可以在网络上访问。刮板嵌入在 Heroku 上的 Flask 应用程序中。有没有办法让 Selenium 浏览器在 Heroku 服务器上运行?或者有没有可以工作的托管服务提供商?
Heroku,虽然很棒,但有一个主要限制,即不能使用自定义软件,或者在许多情况下,不能使用库。在提供易于使用、集中控制、托管的堆栈时,Heroku 剥离了他们的服务器以防止其他用途。
这归结为 Heroku dyno 上没有 Xorg。缺乏 Xorg 和缺乏安装自定义软件的能力意味着没有 xvfb,也没有能力运行 selenium 期望存在的浏览器。此外,浏览器通常不可用。
使用像 AWS 这样的云产品会带来更好的运气,您可以在其中安装自定义软件,包括 firefox、xvfb(以避免需要所有 Xorg 开销),当然还有其余的抓取堆栈。这个答案解释了如何正确地做到这一点。
有一些 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)