Python无头浏览器适用于GAE

7

我正在尝试在Google App Engine上使用Angular.js客户端和webapp2。

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

是否有适用于Google App Engine的Python无头浏览器?

2个回答

13

现在可以使用自定义运行时在App Engine Flex上完成此操作,因此我正在添加此答案,因为在谷歌中搜索此问题是第一件事。

我基于我的其他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位):

https://github.com/mozilla/geckodriver/releases

其他注意事项:

本地测试:

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

1
感谢您提供深入的答案。当时,这很困难,现在我们试图解决的问题变得微不足道,也不再相关。希望这能帮助其他开发人员并引导他们走向正确的方向。干杯! - lnaia
1
这很好。这个在Chromdriver上不起作用的原因是什么? - goose
我想它应该可以工作,但请看我的“其他注意事项”部分。我遇到了很多奇怪的问题,所以要准备好一些调试工作。 - Alex

3
这是一个非常抽象的想法。通过使用无头浏览器来渲染页面并返回结果,由Web服务器满足Web请求。请看关于无头浏览器的下面回答,特别关注基于Python的浏览器。
无头浏览器问题:headless internet browser? 看起来,所有支持JavaScript的浏览器都使用WebKit,并需要PyQt或Pyside。这意味着由于现有运行时限制,您将无法在App Engine上运行它们。
出于SEO目的,建议进行用户代理检测并使用Jinja2模板等发出超级简化版本的页面。这样做可能会获得更好的性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接