Webページ取得の際に、トークンやトランザクションIDを含む場合、
毎回最新の値に更新しないと正常にクローリングが
出きません。
そこで、送信リクエストの値を置換する必要があったわけで、
正規表現と自力の置換のスピードを検証してみました。
置換キーワードが最後にあっても少し時間が変わる程度でした。
for loop replace start : 12:45:34
for loop replace end : 12:47:38
re replace start : 12:47:38
re replace end : 12:47:52
re replace compile start : 12:47:52
re replace compile end : 12:48:07
結果はやっぱり、正規表現の置換が圧倒的に早いですね。
毎回コンパイルしても数秒しか変わらなかったです。
# -*- coding:utf-8 -*-
import re
import datetime
token_str = 'transactionid'
token_data = 'test'
token_test = '({0}=.*?\&)'.format(token_str)
p = re.compile(token_test)
loop_cnt = 500000
body = 'transactionid=77da7256ba2e785b8428745ed2bdc81dd94bf650&mode=confirm'
while True:
body += '&test=test'
if len(body) >= 1000:
break
print body
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace start',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
generate_body=''
tmp_list = body.split('&')
for tmp in tmp_list:
if tmp.find(tmp) != -1:
_name = tmp.split('=',1)[0]
_data = tmp.split('=',1)[1]
if _name == token_str:
generate_body += _name + '=' + token_data + '&'
else:
generate_body += tmp + '&'
# 最後の&を削除
generate_body = generate_body.rstrip('&')
i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
#==================================================================================================
print '{0:25} : {1}'.format('re replace start',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
if body.find(token_str) != -1:
generate_body = p.sub(token_str + '=' + token_data + '&',body)
generate_body = generate_body.rstrip('&')
i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
#==================================================================================================
print '{0:25} : {1}'.format('re replace compile end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
if body.find(token_str) != -1:
p = re.compile(token_test)
generate_body = p.sub(token_str + '=' + token_data + '&',body)
generate_body = generate_body.rstrip('&')
i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('re replace compile end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
Dictionaryでkeyがない場合の初期値設定をtry - exceptで書いてたけど
getを使えば良いのを教えてもらった。
うーん。コードがすっきりする。
initial_data = 2
temp = {}
temp['key'] = 1
print temp.get('key',initial_data)
print temp.get('None',initial_data)
try:
print temp['None']
except KeyError:
print initial_data
getを使えば良いのを教えてもらった。
うーん。コードがすっきりする。
initial_data = 2
temp = {}
temp['key'] = 1
print temp.get('key',initial_data)
print temp.get('None',initial_data)
try:
print temp['None']
except KeyError:
print initial_data
import datetime
today = datetime.date.today()
dateObj = today - datetime.timedelta(weeks=1) # 一週間前なら1
print dateObj
dateObj = today - datetime.timedelta(days=1) # 1日前なら1
print dateObj
today = datetime.date.today()
dateObj = today - datetime.timedelta(weeks=1) # 一週間前なら1
print dateObj
dateObj = today - datetime.timedelta(days=1) # 1日前なら1
print dateObj