在服务器上运行selenium浏览器(Flask/Python/Heroku)

Jav*_*aaa 12 python selenium heroku web-scraping flask

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

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

小智 14

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

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

您可以通过AWS等云产品获得更好的运气,您可以在其中安装自定义软件,包括firefox,xvfb(以避免需要所有Xorg开销),当然还有其他的抓取堆栈.这个答案解释了如何正确地做到这一点.


小智 6

有 buildpacks 可以让 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
Run Code Online (Sandbox Code Playgroud)

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

heroku stack:set cedar-14 -a stocksdata
Run Code Online (Sandbox Code Playgroud)

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

options = ChromeOptions()
options.binary_location = "/app/.apt/usr/bin/google-chrome-stable"
driver = webdriver.Chrome(chrome_options=options)
Run Code Online (Sandbox Code Playgroud)