使用Django和CasperJS捕获网页
项目描述
django-screamshot
django-screamshot 是一个使用 CasperJS (aaAAaah!, phantomjs:))) 的网页抓取的 非常简单 实现。
(有关待完成工作的更多详细信息,请参阅问题页面。)
检查 screamshotter,一个由 django-screamshot 驱动的最简单的 Django 项目。
安装
首先确保您已经在您的 PATH 中安装了 casperjs 或 phantomjs 命令,使用相关的安装说明
然后安装 egg
pip install django-screamshot
用法
将 screamshot 添加到您的 INSTALLED_APPS
作为截图 Web API
将其添加到您的项目 URL 中
urlpatterns = patterns('', ... url(r'^capture/$', include('screamshot.urls', namespace='screamshot', app_name='screamshot')), )
您可以使用以下 GET 参数获取截图
- url
要捕获的网站 URL。这可以是完全限定的 URL,也可以是您 Django 项目中要反转的 URL 名称。注意:不要忘记对 url 进行编码。
- selector
CSS3 选择器。它将截图限制在所选元素内。
- method
要使用的 HTTP 方法(默认:GET)
- width
视口宽度(默认:1400)
- height
视口高度(默认:900)
- data
要发布的 HTTP 数据(默认:{})
- waitfor
CSS3 选择器。只有当此选择器满足条件时,才会进行截图。典型用法:如果您的页面包含大量的 JavaScript 处理,您可以在处理完成后在元素上添加一个 CSS 类,以确保截图正确渲染页面。
- render
如果 render=html,则返回包含图像和自动打开打印对话框的 HTML 页面。
- size
调整图像大小(宽度 x 高度,例如:500x500),需要安装 PIL 或 Pillow。
- crop
如果 true,则结果图像将被裁剪以匹配指定的大小。
例如: http://server/capture/?url=http://django-fr.org&selector=body&width=1024&height=768&size=500x500
作为模板标记
您可以使用模板标记将截图包含在您的页面中。它将执行捕获并返回结果图像的 base64 版本。
如果您不想公开捕获 API,这将非常有用。
{% base64capture URL SELECTOR %}
例如,在一个 SVG 模板中
{% load screamshot %} ... <image y="200" x="300" id="imagemap" xlink:href="data:{% base64capture "company:map" "#map" %}" width="640" />
如果您在另一个实例上运行捕获服务器,您可以指定反转的根 URL(默认为本地)
SCREAMSHOT_CONFIG = { 'CAPTURE_ROOT_URL': 'http://127.0.0.1:8001', }
作为库 - 渲染本地 Django 模板
有时,您无法访问请求对象。一个典型的例子是为客户创建 PDF 收据并将其发送电子邮件。这两个任务都可能需要一段时间,因此将它们推入某个队列(如 RabbitMQ)是自然的。但是,如果您的 PDF 渲染任务执行,您就无法访问请求对象。不用担心 - 您仍然可以使用 screamshot 作为库。以下是方法。
from screamshot.utils import render_template # you can either render the template to a TemporaryFile: with render_template('my-template.html', {'context': 'variables'}) as output: # do anything you want with the output # like attach it to email message, etc. print(output.name) # or you can specify a path instead: render_template('my-template.html', {'context': 'variables'}, output='/home/you/rendering.png', format='png')
请注意,为了加载您的静态文件,screamshot 将尝试用您静态文件的本地路径替换所有 STATIC_URL 出现(当然,如果它们不是通过 https 提供的)
自定义页面渲染
casperjs脚本将 CSS类附加到元素上。您可以使用这个CSS标记轻松地在CSS样式表中自定义打印时的渲染
.screamshot #navigation { display: none; } .screamshot #main { margin: 2em; }
捕获带认证的视图
您可以在Django项目中使用基本HTTP认证,为截图创建一个专用用户,并带上凭据捕获完整的URL(例如:http://user:password@host/page/)。
或者,您可以使用特定的视图装饰器。
在您的设置中定义授权IP以捕获您的页面
SCREAMSHOT_CONFIG = { 'CAPTURE_ALLOWED_IPS': ('127.0.0.1',), }
并使用提供的装饰器
from screamshot.decorators import login_required_capturable @login_required_capturable def your_view(request): ...
渲染命令和CLI参数
您可以通过设置CAPTURE_METHOD设置来指定要使用的渲染器。默认值是‘casperjs’。可能的值是‘casperjs’和‘phantomjs’。
SCREAMSHOT_CONFIG = { 'CAPTURE_METHOD': 'phantomjs', }
默认情况下,我们在PATH环境变量(如which)中查找CasperJS/PhantomJS二进制文件,但您可以绕过此操作
SCREAMSHOT_CONFIG = { 'CASPERJS_CMD': '/home/you/Downloads/apps/casperjs', 'PHANTOMJS_CMD': '/home/you/Downloads/apps/phantomjs' }
请注意,CAPTURE_METHOD设置指定了将被评估的位置,即如果您将CAPTURE_METHOD设置为‘phantomjs’,则PHANTOMJS_CMD将被评估。
- 您还可以指定PhantomJS/CasperJS的额外参数,例如
通过CLI_ARGS设置使用--disk-cache=true
SCREAMSHOT_CONFIG = { 'CLI_ARGS': ['--disk-cache=true', '--max-disk-cache-size=30000'] }
请参阅PhantomJS和CasperJS主页上的相关文档。
您还可以覆盖捕获脚本。默认实现使用为CasperJS编写的捕获脚本。还提供了一个PhantomJS的默认捕获脚本。
如果您有自己的脚本希望使用,请在CAPTURE_SCRIPT选项中指定它。
SCREAMSHOT_CONFIG = { 'CAPTURE_SCRIPT': '/home/you/scripts/capture.js', }
您还可以添加与CSS3选择器的最大等待时间对应的超时时间(请参阅waitfor选项)
SCREAMSHOT_CONFIG = { 'TIMEOUT': 7000 #ms 5000 by default, }
关于runserver的说明
如果您想使用manage.py runserver进行测试,您将无法捕获来自同一实例的页面。
运行两次(在两个端口上),并配置CAPTURE_ROOT_URL。
许可证
Lesser GNU公共许可证
更改日志
0.8.5 (2020-04-09)
修复支持Django 2,2.1,2.2
0.8.4 (2020-04-08)
添加支持Django 2,2.1,2.2
添加waittimeout设置
0.8.2 (2018-07-04)
将响应错误的状态代码从400更改为500
0.8.1 (2017-06-14)
修复PATH中的phantom路径
0.8.1 (2017-05-05)
修复python 3支持
添加对Django 1.11的支持
停止支持Django <1.8
0.7.0 (2017-01-08)
支持渲染PDF
Python 3支持
Django 1.8支持
添加TEST_CAPTURE_SCRIPT设置
0.6.0 (2014-11-27)
添加了对纯PhantomJS捕获的支持,即没有CasperJS,没有选择器(由Mateusz Mikolajczyk提供)
支持捕获本地渲染的模板,无需外部请求(由Mateusz Mikolajczyk提供)
0.5.0 (2014-11-11)
添加了截图模型和管理站支持(由Luc Milland提供)
允许在截图前等待给定时间(毫秒)(由Florent Lebreton提供)
在django1.7兼容性中将mimetype替换为content_type(由Florent Lebreton提供)
0.4.0 (2014-03-19)
如果没有提供URL,则使用请求的主机(由Mozillag提供)
允许提供自定义的PhantomJS命令(由mo-mughrabi提供)
改进日志记录
添加了一些基本的单元测试
0.3.1 (2014-01-31)
修复要求拼写
0.3.0 (2013-09-05)
在参数错误(400)时返回适当的HTTP响应
更好地处理捕获错误,但尚不支持远程JS。(参考#1)
对于casperjs_capture是文件路径的情况,指定了保存临时文件步骤的输出
添加了一个screamshotter孤儿分支,作为一个演示Django项目
控制图像格式的能力(除 png 或 html 之外)
0.2.0 (2013-08-18)
CASPERJS_CMD 设置以绕过 PATH 查找
查询 crop 参数以控制缩放
查询 size 参数以控制图像大小
查询 render 参数以控制输出格式
移除 remote.message 记录
查询 waitFor 参数以控制捕获时机
在 body 上注入 screamshot 类以允许捕获样式
如果没有提供选择器,则使用 capture 而不是 captureSelector
查询参数以控制视口大小
添加额外命令行参数的能力
更新 CasperJS CLI 状态代码
在登录装饰器中检测转发 IP 地址
0.1.1 (2012-04-17)
包含包数据
0.1.0 (2012-04-17)
初始工作版本
项目详细信息
django-screamshot-0.8.5.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 00feb5bb0b23df5efc1d9fc32c8676cf8d14febbf786b0d92a97a66dfc2f793e |
|
MD5 | 058d9c24989edc4c9cdde560a2a989a3 |
|
BLAKE2b-256 | 17c9fa024199e8bba3a329260a76358698b38f613ada586dbde46694195e80c4 |