KindleのAPIから、セール情報を取得し、HTML上に出力するPythonスクリプトを作成。こうすることで、アフィリエイトにも転用できる。 pic.twitter.com/NxwKiqzMtG— DAI (@never_be_a_pm) November 21, 2017
つい最近、ほけきよさん(@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から、自動生成する方法でした。
人によっては難しいと思うので、こういうものを作ってみたい場合はプログラミング教えます
初心者向けにプログラミング学習をサポートします プログラミングで挫折し、誰かの助けが欲しいあなたへ|プログラミング | ココナラ
何かプログラミングでやりたいことがあっても、それをどう実現したらいいのかがわからなかったり、エラーを一人で解決できないことは多々あります。僕の場合、最初は挫折しました。最...