通过产品广告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。默认为:https://: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 |