用于GAE的Python无头浏览器

用于GAE的Python无头浏览器,python,google-app-engine,headless-browser,Python,Google App Engine,Headless Browser,我试图在Google Appengine上使用Angular.js客户端和webapp2 为了解决SEO问题,想法是使用无头浏览器运行javascript服务器端,并将生成的html提供给爬虫 有没有在google app engine上运行的python无头浏览器?这是一个超级元概念。web服务器使用无头web浏览器来呈现页面并返回结果的web请求。呸 看看下面关于无头浏览器的回答,特别注意基于Python的浏览器 无头浏览器问题: 看起来支持Javascript的都使用WebKit,需要Py

我试图在Google Appengine上使用Angular.js客户端和webapp2

为了解决SEO问题,想法是使用无头浏览器运行javascript服务器端,并将生成的html提供给爬虫


有没有在google app engine上运行的python无头浏览器?

这是一个超级元概念。web服务器使用无头web浏览器来呈现页面并返回结果的web请求。呸

看看下面关于无头浏览器的回答,特别注意基于Python的浏览器

无头浏览器问题:

看起来支持Javascript的都使用WebKit,需要PyQt或Pyside。这意味着,由于存在运行时限制,您将无法在App Engine上运行它们


我建议你做一些搜索引擎优化的用户代理检测,并使用Jinja2模板或其他东西发布一个超级缩小版的页面。无论如何,通过这种方式,您可能会获得更好的性能

这现在可以在App Engine Flex上通过自定义运行时完成,因此我添加了这个答案,因为这个问题是google中第一个弹出的问题

我基于我的另一个GAE-flex微服务的定制运行时,它使用预先构建的python运行时

项目结构:

webdrivers/
- geckodriver
app.yaml
Dockerfile
main.py
requirements.txt
app.yaml:

service: my-app-engine-service-name
runtime: custom
env: flex
entrypoint: gunicorn -b :$PORT main:app --timeout 180
Dockerfile:

FROM gcr.io/google-appengine/python
RUN apt-get update
RUN apt-get install -y xvfb
RUN apt-get install -y firefox
LABEL python_version=python
RUN virtualenv --no-download /env -p python
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/
CMD exec gunicorn -b :$PORT main:app --timeout 180
requirements.txt:

Flask==0.12.2
gunicorn==19.7.1
selenium==3.13.0
pyvirtualdisplay==0.2.1
main.py

import os
import traceback

from flask import Flask, jsonify, Response
from selenium import webdriver
from pyvirtualdisplay import Display

app = Flask(__name__)

# Add the webdrivers to the path
os.environ['PATH'] += ':'+os.path.dirname(os.path.realpath(__file__))+"/webdrivers"

@app.route('/')
def hello():
    return 'Hello!!'

@app.route('/test/', methods=['GET'])
def go_headless():
    try:
        display = Display(visible=0, size=(1024, 768))
        display.start()
        d = webdriver.Firefox()
        d.get("http://www.python.org")    
        page_source = d.page_source.encode("utf-8")
        d.close()
        display.stop()
        return jsonify({'success': True, "result": page_source[:500]})
    except Exception as e:
        print traceback.format_exc()
        return jsonify({'success': False, 'msg': str(e)})

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)
从此处下载geckodriver(linux 64):

其他注意事项:

  • 请注意您正在使用的geckodriver、firefox和selenium版本,因为它可能是finnickey,因此出现以下错误
    WebDriverException:Message:无法加载配置文件。可能的firefox版本不匹配。Firefox48+必须使用GeckoDriver。Profile Dir:/tmp/tmp 48P如果您在FirefoxBinary构造函数中指定了日志文件,请检查它以了解详细信息。
  • 除非您使用的是旧版geckodriver/firefox,否则不要设置
    DesiredCapabilities().firefox[“木偶网”]=False
  • 需要
    display=display(可见=0,大小=(1024768))
    来修复此错误:
本地测试:

docker build . -t my-docker-image-tag
docker run -p 8080:8080 --name=my-docker-container-name my-docker-image-tag
要部署到应用程序引擎,请执行以下操作:

gcloud app deploy app.yaml --version dev --project my-app-engine-project-id

谢谢你的深入回答。当时,这很难,现在我们试图解决的问题变得微不足道,不再相关。希望这将帮助其他开发人员,并推动他们朝着正确的方向前进。干杯这太棒了。有没有任何理由这不适用于Chromdriver?我想应该可以,但请参见我的
其他注释:
部分。我遇到了很多奇怪的问题,所以请做好修补的准备。