跳转到主要内容

通过产品广告API监控亚马逊产品的价格

项目描述

Build Status codecov.io Code issues Requirements Status Stories in Ready Code Health

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库

基本设置

将以下应用程序添加到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设置 - 您只需要dockerdocker-compose。设置几乎与treasury(由darignac发起的项目)相同,您可以在那里阅读文档以获得更好的了解。

结构

有5个容器

db

Postgres数据库

redis

Celery代理

web

包含django-amazon-price-monitor包的django项目

celery

django项目的celery

data

挂载卷的容器

web和celery容器使用在docker/web下设置的Docker镜像。

镜像:基础

基本镜像包含所有必要的系统包和预安装的lxmlpsycopg2。该镜像可在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

  • Postgres 数据目录

  • 即使容器被删除也保留 DB 数据

/srv/logs

<PROJECTROOT>/docker/logs

Django 日志(参见项目设置)

/srv/media

<PROJECTROOT>/docker/media

Django 媒体文件

/srv/project

<PROJECTROOT>/docker/web/project

  • Django 项目

  • 在 Dockerfile 中复制以启动和运行

  • 然后挂载(复制被覆盖)

/srv/pricemonitor

<PROJECTROOT>

  • django-amazon-price-monitor

  • 在 Dockerfile 中复制以启动和运行

  • 然后挂载(复制被覆盖)

用法

覆盖设置

要覆盖一些设置以及设置所需的 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

应用程序使用名为“price_monitor”的记录器记录所有错误和未包含在专用其他记录器中的信息消息。请参阅 Django 记录文档 了解如何设置记录器。

price_monitor.product_advertising_api

与通过 bottlenose 访问 Amazon 产品广告 API 的 ProductAdvertisingAPI 包装类相关的所有内容的记录器。

price_monitor.utils

utils 模块的记录器。

测试

覆盖率

codecov-graph

内部

模型图

Model Graph

产品广告API同步

任务工作流程

Image of Product advertising api synchronization workflow

产品广告 API 同步工作流程的图像

变更日志

0.7

功能

  • 现在可以通过模板块 footer 扩展页脚

  • 前端产品添加改进 #79 (PR#104)

  • 删除 urlpatterns 以满足 Django 1.10 弃用

  • 添加开发 docker 设置(PR#101

  • 如果区域为德国且产品也为 18+,则在通知邮件中列出具有受众评级 18+ 的产品 #92 (PR#93)

错误修复

  • 现在捕获来自 Amazon API 返回的 XML 的解析错误 #96

  • 价格图中显示的价格的固定日期范围 #90

  • 价格图中旧价格的固定显示 #97

  • 更新到最新的 python-dateutil 版本,某种方式引用 #95

0.6.1

错误修复

  • StartupTask 报异常 #94

  • 如果今天是11月的最后一天,则测试失败 #95

0.6

功能

  • djangorestframework 3.2 兼容性 #86 (PR#88)

错误修复

  • FindProductsToSynchronizeTask 被重新安排两次或更多 #89 (PR#91)

  • 无法将 2015-02 解析为 datetime #57

  • 大量代码风格问题

  • 小错误修复

0.5

功能

错误修复

  • FindProductsToSynchronizeTask 不总是重新安排 #61

  • 字体文件未包含在包中 #75

  • 识别为 Amazon 会员 #77

拉取请求

0.4

功能

  • 弃用旧前端 #73

  • 将 angular 设置为默认前端 #70

错误修复

  • 在图形时间范围内价格相同的产品的图形为空 #67

  • 音乐专辑的通知 #33

  • 为音频产品添加艺术家 #71

拉取请求

0.3b2

功能

错误修复

  • 某些产品的图形为空 #65

  • 不要显示其他人的价格限制 #63

  • 图形未渲染正确值 #60

  • ‘NoneType’ 对象没有属性 ‘url’ #59

  • 重命名 SynchronizeSingleProductTask #56

  • 产品创建时同步不工作 #55

  • 清除旧产品及价格 #47

  • 删除产品订阅后未从列表视图中移除 #42

  • 无限同步队列 #38

  • 标记不可用产品 #14

已关闭的问题

  • 取消固定 beautifulsoup4==4.3.2 #50

拉取请求

预发布版本

  • 不幸的是,之前的一切都没有打包、发布或跟踪。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django-amazon-price-monitor-0.7.tar.gz (255.9 kB 查看哈希值)

上传于 源代码

构建版本

django_amazon_price_monitor-0.7-py2.py3-none-any.whl (276.9 kB 查看哈希值)

上传于 Python 2 Python 3

由以下支持