2017-11-21

【Python】Amazonのセール商品をAmazon Product Advertising APIで抽出し、自動記事作成をやってみた

こんにちは、DAIです。



つい最近、ほけきよさん(@hokekiyoo)が、AmazonのAPIを使って、自動記事作成で3日で1万円儲けたみたいな話をしたので、僕もやってました。やり方については企業秘密にしていたので、僕が公開しちゃいますよと。


とりあえず、やりたいこととしては、

  • Amazonのセール商品をAPIから取得
  • 自分のアフィリエイトコードを入れたURLを作成
  • bootstrapで、いい感じにそのデータをもとに自動で記事を作成

です。うまくいくと、アフィリエイトコード付きで、こんな感じになります。






実装


とりあえず、完成したコードがこちら。順におって説明していきます。

kindle.py


import bottlenose
import time
import requests
from flask import Flask

AMAZON_ACCESS_KEY = ""
AMAZON_SECRET_KEY= ""
AMAZON_ASSOC_TAG= ""


#1 

app = Flask(__name__)

#2

@app.route('/')
def parseHTML():

    responses = getResponses()
    content = """
            <!doctype html>
            <html lang="en">
              <head>
                <title>Hello, world!</title>
                <!-- Required meta tags -->
                <meta charset="utf-8">
                <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

                <!-- Bootstrap CSS -->
                <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
              </head>
              <body>
                <div class='container'>
            """
    for response in responses:
        try:
            content += "<div class='row'>"
            content +=      "<div class='col-md-10 col-md-offset-1'>"
            content +=          "<div><h3>{}</h3></div>\n\n".format(response.title.text)
            content +=          "<div>著者:{}</div>".format(response.author.text)
            content +=          "<div><a href = '{}'><img src = '{}'></a></div><!-- 画像-->\n".format(response.detailpageurl.text, response.largeimage.url.text)
            content +=          "<div><blockquote class='blockquote'><p class='mb-0'>{}<p></blockquote></div><!-- 内容-->\n".format(response.content.text)
            content +=          "<div><a href='{}'>詳細はこちら</a></div><!-- リンク-->\n".format(response.detailpageurl.text)
            content +=      "</div>"
            content+= "</div>"
        except Exception as e:
            content +=      "</div>"
            content+= "</div>"
            print(e)

    content += """
            </div>
            <!-- Optional JavaScript -->
            <!-- jQuery first, then Popper.js, then Bootstrap JS -->
            <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
          </body>
        </html>
        """
    return content

#3

def getResponses():
    while True:
        try:        
            amazon = bottlenose.Amazon(AMAZON_ACCESS_KEY,AMAZON_SECRET_KEY, AMAZON_ASSOC_TAG, Region='JP')
            response = amazon.ItemSearch(
                SearchIndex = 'Books',
                BrowseNode = 3550442051,
                ResponseGroup= 'Large'
                    )
            soup = BeautifulSoup(response,"lxml")
            print("データの取得に成功しました")
            return (soup.findAll("item"))
            #return (soup.prettify())
        except: #503エラーが出たら再取得する
            print("再取得しています....")
            time.sleep(3)

#4

if __name__ == '__main__':
    app.run()

環境

Windows Subsystem for LinuxでUbuntu動かしています。
Python3です。

実装

bottlenoseは、AmazonのAPIを利用するうえで、必要なモジュールです。
timeはちょっとまったりするときに使うあれです。
flaskは、pythonの実行結果をローカルホスト上で出力するモジュールですね。

import bottlenose
import time
import requests
import beautifulsoup
from flask import Flask

とりあえず、


$ pip install bottolenose
$ pip install flask
$ pip install beautifulsoup

しておきましょう。

そんでもって、AmazonのAPIのキーをいろいろ取得して代入しておきます。

AMAZON_ACCESS_KEY = ""
AMAZON_SECRET_KEY= ""
AMAZON_ASSOC_TAG= ""


で、とりあえずローカルホストでサーバーを立てる上で、以下のコードを実行

#1 

app = Flask(__name__)

ローカルホストのルートで実行できるように、以下のように記述します。
#2

@app.route('/')
def parseHTML():

次にこんなメソッドが出てきます。

 responses = getResponses()

これは、あれなんで、先に説明しちゃいます。
これは、Amazonにnodeを投げて、その時に返ってくるレスポンスを返すという値です。
nodeというのは、商品リストみたいなものです。例えば、【50%OFF以上】Kindleビジネス書・自己啓発書フェアのURLには

https://www.amazon.co.jp/b?node=5302163051

と書いてあり、このnodeから商品を検索することができます。
BrowseNodeの中に代入してあげるとよさそうです。
ちなみに結構エラーがでるので、成功するまでずっとループさせる処理にしています。

#3

def getResponses():
    while True:
        try:        
            amazon = bottlenose.Amazon(AMAZON_ACCESS_KEY,AMAZON_SECRET_KEY, AMAZON_ASSOC_TAG, Region='JP')
            response = amazon.ItemSearch(
                SearchIndex = 'Books',
                BrowseNode = 3550442051,
                ResponseGroup= 'Large'
                    )
            soup = BeautifulSoup(response,"lxml")
            print("データの取得に成功しました")
            return (soup.findAll("item"))
            #return (soup.prettify())
        except: #503エラーが出たら再取得する
            print("再取得しています....")
            time.sleep(3)


で、とってきた値を返します。ここではBeautifulSoupを使って処理しています。

return (soup.findAll("item"))

で、さっきの続き。parseHTMLメソッドの中の処理の説明ですね。
基本的には、最終的にreturnするcontentの中に、HTMLをぶちこみまくる実装となっておりまります。まず最初に、bootstrapテンプレートのHTMLをぶち込みます。

def parseHTML():

    responses = getResponses()
    content = """
            <!doctype html>
            <html lang="en">
              <head>
                <title>Hello, world!</title>
                <!-- Required meta tags -->
                <meta charset="utf-8">
                <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

                <!-- Bootstrap CSS -->
                <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
              </head>
              <body>
                <div class='container'>
            """

で、そのあとに書く本の情報を一つ一つ取り出して、HTMLに追加します。+=は、前のStringに連結して加えています。

for response in responses:
        try:
            content += "<div class='row'>"
            content +=      "<div class='col-md-10 col-md-offset-1'>"
            content +=          "<div><h3>{}</h3></div>\n\n".format(response.title.text)
            content +=          "<div>著者:{}</div>".format(response.author.text)
            content +=          "<div><a href = '{}'><img src = '{}'></a></div><!-- 画像-->\n".format(response.detailpageurl.text, response.largeimage.url.text)
            content +=          "<div><blockquote class='blockquote'><p class='mb-0'>{}<p></blockquote></div><!-- 内容-->\n".format(response.content.text)
            content +=          "<div><a href='{}'>詳細はこちら</a></div><!-- リンク-->\n".format(response.detailpageurl.text)
            content +=      "</div>"
            content+= "</div>"
        except Exception as e:
            content +=      "</div>"
            content+= "</div>"
            print(e)

たまに情報がない時があり、そうなるとエラーが起こります。その時のためにtry exceptで捕まえて、だめだったときはdivの閉じタグを入れています。

except Exception as e:
            content +=      "</div>"
            content+= "</div>"
            print(e)

で、最後まで挿入が終わり次第、HTMLを閉じます。そして、このHTMLをローカルホストに返します。

content += """
            </div>
            <!-- Optional JavaScript -->
            <!-- jQuery first, then Popper.js, then Bootstrap JS -->
            <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
          </body>
        </html>
        """
    return content

ここまでがメソッドなので、mainクラスで呼び出します。

#4

if __name__ == '__main__':
    app.run()


そうすると、ローカルホストが立ち上がって、こんな感じの絵が出てきます。




ということで、AmazonのAPIから、自動生成する方法でした。
人によっては難しいと思うので、こういうものを作ってみたい場合はプログラミング教えます


初心者向けにプログラミング学習をサポートします プログラミングで挫折し、誰かの助けが欲しいあなたへ|プログラミング | ココナラ

何かプログラミングでやりたいことがあっても、それをどう実現したらいいのかがわからなかったり、エラーを一人で解決できないことは多々あります。僕の場合、最初は挫折しました。最...

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...