通过产品广告API监控亚马逊产品的价格
项目描述
django-amazon-price-monitor
通过产品广告API监控亚马逊产品的价格。
基本结构
这是一个可重用的Django应用程序,可以集成到您的项目中。它基本上由以下部分组成
模型
前端组件
Angular前端API
亚马逊API组件
模型
产品
亚马逊产品的表示
价格
特定时间点亚马逊产品价格的表示
订阅
以特定价格通过电子邮件通知订阅产品
前端组件
前端显示所有已订阅的产品,包括额外信息和价格历史的一些图表。
功能如下
列出产品
显示产品详情
显示产品价格图表
添加订阅
调整订阅价格值
删除订阅
Angular前端API
基于Django REST Framework简化AngularJS使用的API。
亚马逊API组件
通过Celery驱动的多个任务从亚马逊产品广告API获取产品信息,并将数据编织到模型中。
许可证
本软件使用MIT许可证。因此,您可以自由地用它做任何您喜欢的事情。
设置
先决条件
Python |
3.3 |
3.4 |
3.5 |
---|---|---|---|
Django |
1.8 |
1.8或1.9 |
1.9 |
有关其他使用包,请参阅setup.py。
包含的Angular库
angular-django-rest-resource (提交:81d752b363668d674201c09d7a2ce6f418a44f13)
基本设置
将以下应用程序添加到INSTALLED_APPS
INSTALLED_APPS = ( ... 'price_monitor', 'price_monitor.product_advertising_api', 'rest_framework', )
然后迁移
python manage.py migrate
适当调整设置,参见下一章。
包含URL配置。
设置Celery - 您需要一个beat和一个worker。
设置
以下显示设置的值是其默认值。如果值为“…”,则没有默认值。
必须的设置
以下设置对于价格监控运行是绝对必要的,请设置它们
Celery
您需要设置代理和结果后端。
BROKER_URL = ... CELERY_RESULT_BACKEND = ... # some additional settings CELERY_ACCEPT_CONTENT = ['pickle', 'json'] CELERY_CHORD_PROPAGATES = True
Rest-Framework
我们使用Rest-Framework为Angular前端
REST_FRAMEWORK = { 'PAGINATE_BY': 50, 'PAGINATE_BY_PARAM': 'page_size', 'MAX_PAGINATE_BY': 100, }
站点URL
指定您的网站可用的基本URL。默认为:http://localhost:8000 在通知电子邮件中创建指向网站的链接所必需的。
# base url to the site PRICE_MONITOR_BASE_URL = 'https://....'
AWS和产品广告API凭证
# your Amazon Web Services access key id PRICE_MONITOR_AWS_ACCESS_KEY_ID = '...' # your Amazon Web Services secret access key PRICE_MONITOR_AWS_SECRET_ACCESS_KEY = '...' # the region endpoint you want to use. # Typically the country you'll run the price monitor in. # possible values: CA, CN, DE, ES, FR, IT, JP, UK, US PRICE_MONITOR_AMAZON_PRODUCT_API_REGION = '...' # the assoc tag of the Amazon Product Advertising API PRICE_MONITOR_AMAZON_PRODUCT_API_ASSOC_TAG = '...'
亚马逊联盟
由于亚马逊的链接将是带有您的亚马逊联盟标签的联盟链接(见上文),您必须设置免责声明的名称(见https://partnernet.amazon.de/gp/associates/agreement)。
# name of you/your site PRICE_MONITOR_AMAZON_ASSOCIATE_NAME = 'name/sitename' # Amazon site being used, choose from on of the following 'Amazon.co.uk' 'Local.Amazon.co.uk' 'Amazon.de' 'de.BuyVIP.com' 'Amazon.fr' 'Amazon.it' 'it.BuyVIP.com' 'Amazon.es' 'es.BuyVIP.com' PRICE_MONITOR_AMAZON_ASSOCIATE_SITE = '<ONE FROM ABOVE>'
图片协议和域名
# if to use the HTTPS URLs for Amazon images. # if you're running the monitor on SSL, set this to True # INFO: # Product images are served directly from Amazon. # This is a restriction when using the Amazon Product Advertising API PRICE_MONITOR_IMAGES_USE_SSL = True # domain to use for image serving. # typically analog to the api region following the URL pattern # https://images-<REGION>.ssl-images-amazon.com PRICE_MONITOR_AMAZON_SSL_IMAGE_DOMAIN = 'https://images-eu.ssl-images-amazon.com'
可选设置
以下设置可以调整,但带有合理的默认值。
产品同步
# time after which products shall be refreshed # Amazon only allows caching up to 24 hours, so the maximum value is 1440! PRICE_MONITOR_AMAZON_PRODUCT_REFRESH_THRESHOLD_MINUTES = 720 # 12 hours
通知
要发送通知电子邮件,请设置适当的电子邮件后端(见Django文档)。
# time after which to notify the user again about a price limit hit (in minutes) PRICE_MONITOR_SUBSCRIPTION_RENOTIFICATION_MINUTES = 10080 # 7 days # sender address of the notification email PRICE_MONITOR_EMAIL_SENDER = 'noreply@localhost' # currency name to use on notifications PRICE_MONITOR_DEFAULT_CURRENCY = 'EUR' # subject and body of the notification emails gettext = lambda x: x PRICE_MONITOR_I18N_EMAIL_NOTIFICATION_SUBJECT = gettext( 'Price limit for %(product)s reached' ) PRICE_MONITOR_I18N_EMAIL_NOTIFICATION_BODY = gettext( 'The price limit of %(price_limit)0.2f %(currency)s has been reached for the ' 'article "%(product_title)s" - the current price is %(price)0.2f %(currency)s.' '\n\nPlease support our platform by using this ' 'link for buying: %(link)s\n\n\nRegards,\nThe Team' ) # name of the site in notifications PRICE_MONITOR_SITENAME = 'Price Monitor'
缓存
# key of cache (according to project config) to use for graphs # None disables caching. PRICE_MONITOR_GRAPH_CACHE_NAME = None # prefix for cache key used for graphs PRICE_MONITOR_GRAPH_CACHE_KEY_PREFIX = 'graph_'
Celery设置
要运行所需的Celery任务,Celery本身必须设置。请参阅Celery文档有关如何设置整个内容的说明。您需要配置代理和结果后端。
使用Docker进行开发设置
该软件包包含一个易于使用的Docker设置 - 您只需要docker和docker-compose。设置几乎与treasury(由darignac发起的项目)相同,您可以在那里阅读文档以获得更好的了解。
结构
有5个容器
db |
Postgres数据库 |
redis |
Celery代理 |
web |
包含django-amazon-price-monitor包的django项目 |
celery |
django项目的celery |
data |
挂载卷的容器 |
web和celery容器使用在docker/web下设置的Docker镜像。
镜像:基础
基本镜像包含所有必要的系统包和预安装的lxml和psycopg2。该镜像可在Docker Hub上找到。
镜像:网络
它包含一个Django项目,其中包含登录/注销视图,可在docker/web/project下找到。该镜像来自上面的pricemonitor/base。
容器内的目录结构如下(基础目录:/srv/)
root:/srv tree ├── logs [log files] ├── media [media files] ├── project [the django project] ├── static [static files] └── pricemonitor [the pricemonitor package]
通过启动脚本docker/web/web_run.sh启动,该脚本执行迁移并启动runserver。
镜像:Celery
基本上与web相同,但启动带有beat的Celery worker。
如果您想要开发涉及任务的任何内容,请参阅下面的用法部分。
镜像:数据
data容器挂载了多个路径
容器中的文件夹 |
主机上的文件夹 |
信息 |
---|---|---|
/var/lib/postgresql/data |
<PROJECTROOT>/docker/postgres |
|
/srv/logs |
<PROJECTROOT>/docker/logs |
Django 日志(参见项目设置) |
/srv/media |
<PROJECTROOT>/docker/media |
Django 媒体文件 |
/srv/project |
<PROJECTROOT>/docker/web/project |
|
/srv/pricemonitor |
<PROJECTROOT> |
|
用法
覆盖设置
要覆盖一些设置以及设置所需的 AWS 设置,您可以创建一个 docker-compose.override.yml 并填充特定值(也请参阅 docker-compose 文档)。
请查看或调整 docker\web\project\settings.py 中的所有从环境读取的设置。它们可以被覆盖。
一个示例 docker-compose.override.yml 文件可能如下所示
version: '2' services: celery: command: /bin/true environment: PRICE_MONITOR_AWS_ACCESS_KEY_ID: XXX PRICE_MONITOR_AWS_SECRET_ACCESS_KEY: XXX PRICE_MONITOR_AMAZON_PRODUCT_API_REGION: DE PRICE_MONITOR_AMAZON_PRODUCT_API_ASSOC_TAG: XXX PRICE_MONITOR_AMAZON_PRODUCT_REFRESH_THRESHOLD_MINUTES: 5 PRICE_MONITOR_SUBSCRIPTION_RENOTIFICATION_MINUTES: 60
它将避免 celery 的自动启动(command: /bin/true)并设置 AWS 所需的设置(实际上它们只在 celery 容器中需要)。然后您可以手动启动容器并执行 celery,这对于开发涉及任务更改并因此需要重启 celery 的内容非常有用(从 docker 文件夹中执行!)
alex@tyrion:~/projects/github/django-amazon-price-monitor/docker$ docker-compose run celery bash Starting docker_data_1 # check environment variables root@9d64bbd23e98:/srv/project# env HOSTNAME=9d64bbd23e98 EMAIL_BACKEND=django.core.mail.backends.filebased.EmailBackend POSTGRES_DB=pm_db TERM=xterm PYTHONUNBUFFERED=1 PRICE_MONITOR_SUBSCRIPTION_RENOTIFICATION_MINUTES=60 POSTGRES_PASSWORD=6i2vmzq5C6BuSf5k33A6tmMSHwKKv0Pu PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SECRET_KEY=Vceev7yWMtEQzHaTZX52 PWD=/srv/project BROKER_URL=redis://redis/1 C_FORCE_ROOT='True' PRICE_MONITOR_AWS_SECRET_ACCESS_KEY=XXX POSTGRES_USER=pm_user SHLVL=1 HOME=/root PRICE_MONITOR_AMAZON_PRODUCT_REFRESH_THRESHOLD_MINUTES=5 PRICE_MONITOR_AMAZON_PRODUCT_API_REGION=DE PRICE_MONITOR_AMAZON_PRODUCT_API_ASSOC_TAG=XXX DEBUG='True' PRICE_MONITOR_AWS_ACCESS_KEY_ID=XXX _=/usr/bin/env # start celery (worker and beat) (can also execute /srv/celery_run.sh) root@9d64bbd23e98:/srv/project# celery --beat -A glue worker -------------- celery@9d64bbd23e98 v3.1.23 (Cipater) ---- **** ----- --- * *** * -- Linux-3.16.0-4-amd64-x86_64-with-debian-8.0 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: glue:0x7fc6b5269e10 - ** ---------- .> transport: redis://redis:6379/1 - ** ---------- .> results: disabled:// - *** --- * --- .> concurrency: 8 (prefork) -- ******* ---- --- ***** ----- [queues] -------------- .> celery exchange=celery(direct) key=celery [2016-03-20 10:02:26,776: WARNING/MainProcess] celery@9d64bbd23e98 ready.
启动/停止/构建
使用 make 文件执行最常用的任务。它将以项目名称 pm 执行 docker-compose,结果容器的名称模式为 pm_*。
docker-build-base: - builds the base docker image docker-build-web: - builds the web docker image docker-up: - uses docker-compose to bring the containers up docker-stop: - uses docker-compose to stop the containers docker-ps: - runs docker-compose ps
自动加载包含管理员 admin 和密码 password 的 Django 用户设置。
模板
由于前端由 Angular 完成,因此只有一个具有非常有限调整可能性的模板,price_monitor/angular_index_view.html。您可以扩展模板并调整以下块。
管理命令
price_monitor_batch_create_products
通过提供 ASIN 创建大量产品的管理命令
python manage.py price_monitor_batch_create_products <ASIN1> <ASIN2> <ASIN3>
price_monitor_recreate_product
重新创建具有给定 asin 的产品。如果产品已存在,则将其删除。仅在开发中使用!
python manage.py price_monitor_recreate_product <ASIN>
price_monitor_search
使用给定的 ASIN 在 Amazon(不在数据库中)中搜索产品并打印其详细信息。
python manage.py price_monitor_search <ASIN1> <ASIN2> ...
日志记录器
price_monitor
应用程序使用名为“price_monitor”的记录器记录所有错误和未包含在专用其他记录器中的信息消息。请参阅 Django 记录文档 了解如何设置记录器。
price_monitor.product_advertising_api
与通过 bottlenose 访问 Amazon 产品广告 API 的 ProductAdvertisingAPI 包装类相关的所有内容的记录器。
price_monitor.utils
utils 模块的记录器。
测试
覆盖率
内部
模型图
产品广告API同步
任务工作流程
产品广告 API 同步工作流程的图像
变更日志
0.7
功能
现在可以通过模板块 footer 扩展页脚
删除 urlpatterns 以满足 Django 1.10 弃用
添加开发 docker 设置(PR#101)
错误修复
0.6.1
错误修复
0.6
功能
错误修复
0.5
功能
在通知电子邮件中添加 PM 前端链接 #76
支持 Django 1.9 (见 pull request #80)
错误修复
拉取请求
0.4
功能
错误修复
拉取请求
0.3b2
功能
准备自动发布 #68
提高 Amazon 调用的性能 #41
兼容 Django 1.8 #32
数据减少和清理 #27
限制图形 #26
显示最高和最低价格 #25
实现一个完全可用的前端 `#8 <https://github.com/ponyriders/django-amazon-price-monitor/issues/8>`__
添加更多测试 #2
错误修复
某些产品的图形为空 #65
不要显示其他人的价格限制 #63
图形未渲染正确值 #60
‘NoneType’ 对象没有属性 ‘url’ #59
重命名 SynchronizeSingleProductTask #56
产品创建时同步不工作 #55
清除旧产品及价格 #47
删除产品订阅后未从列表视图中移除 #42
无限同步队列 #38
标记不可用产品 #14
已关闭的问题
取消固定 beautifulsoup4==4.3.2 #50
拉取请求
移除未使用的数据`#48 <https://github.com/ponyriders/django-amazon-price-monitor/pull/48>`__ (dArignac)
waffle.io徽章 #37 (waffle-iron)
预发布版本
不幸的是,之前的一切都没有打包、发布或跟踪。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建版本
哈希值 for django_amazon_price_monitor-0.7-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6ceae40b81684d7d35e64d570ecdd23b5e88e61c3c75034fe437bf1d352317fb |
|
MD5 | a7448ac2c115a6d595f58e55c3256f01 |
|
BLAKE2b-256 | 4746008a347bdd7da079fa3e9ced76fef3b2c76e86394de39479fda014dce391 |