This repository has been archived by the owner on Nov 23, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflaskapp.py
144 lines (128 loc) · 4.45 KB
/
flaskapp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/myenv python
#-*-coding: UTF-8-*-
from flask import Flask, render_template, redirect, url_for, request, session, g
import datetime
import numpy as np
import csv
from bookmeter import BookmeterScraping
from amazon_api import AmazonAPI
from database import Database
import time
import os
import re
app = Flask(__name__)
# @app.route('/')
# def index():
# return 'Index Page'
@app.route('/', methods=['GET', 'POST'])
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
bookmeter_id = request.form['id'].strip()
if bookmeter_id.isdigit():
pass
elif re.match(r'^https?://(w{3}.)?bookmeter.com/users/\d+', bookmeter_id):
bookmeter_id = re.findall(r'\d+', bookmeter_id)[0]
else:
return render_template('login.html', msg='URL {} is incorrect.'.format(request.form['id']))
print(bookmeter_id)
return redirect(url_for('ab', bookmeter_id=bookmeter_id))
return render_template('login.html')
def loadkey(path):
with open(path) as f:
reader = csv.reader(f)
tmplist = []
for line in reader:
tmplist.append(line)
AWS_access_key_id = tmplist[0][0].split('=')[1]
AWS_secret_key = tmplist[1][0].split('=')[1]
return AWS_access_key_id, AWS_secret_key
@app.route('/ab/<bookmeter_id>', methods=['GET', 'POST'])
@app.route('/ab/<bookmeter_id>/<page>', methods=['GET', 'POST'])
def ab(bookmeter_id, page=None):
if page is None:
page=1
starttime = time.time()
bs = BookmeterScraping(bookmeter_id)
db = Database()
db.connect(debug=False)
aws_access_id, aws_secret_key = loadkey('/home/ec2-user/.aws/credentials/rootkey.csv')
api = AmazonAPI(aws_access_id, aws_secret_key, 'asterisk37n-22')
isbns = bs.get_isbns_in_page(page=page)
visible_books = []
query_isbns=[]
time1 = time.time()
print('finished scraping', time1-starttime)
for isbn in isbns:
if db.isnew(isbn):
visible_books.append(db.select_book_dict(isbn))
else:
query_isbns.append(isbn)
if len(query_isbns) == 10:
result = api.query_to_list_of_dicts(*query_isbns)
visible_books.extend(result)
db.insert_row(result)
query_isbns=[]
else:
pass
else:
if query_isbns:
result = api.query_to_list_of_dicts(*query_isbns)
visible_books.extend(result)
db.insert_row(result)
db.commit()
db.close()
print('for loop', time.time()-time1)
books_shown = visible_books
for i in books_shown:
i['reasonable'] = 0<i['used_price']<=100 or 0<=i['price_ratio']<=0.01
i['new_price'] = '{:,d}'.format(i['new_price']) if i['new_price'] >0 else ' - '
i['used_price'] = '{:,d}'.format(i['used_price']) if i['used_price'] >0 else ' - '
@after_this_request
def update_database(response):
return response
start, end = link_range(page, bs.last_page_number)
return render_template('ab.html', books=books_shown, page=int(page), last_page_number=int(bs.last_page_number), bookmeter_id=bookmeter_id, start=start, end=end)
def link_range(page, last):
page, last = int(page), int(last)
if last<11:
return 1,last
else:
if page<=6:
return 1,10
elif page<=last-4:
return page-5, page+4
else:
return last-9, last
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
def after_this_request(f):
if not hasattr(g, 'after_request_callbacks'):
g.after_request_callbacks = []
g.after_request_callbacks.append(f)
return f
@app.after_request
def per_request_callbacks(response):
for func in getattr(g, 'call_after_request', ()):
response = func(response)
return response
# set the secret key. keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
if __name__ == "__main__":
app.run(debug=True)