Hatena::ブログ(Diary)

XXXannex このページをアンテナに追加 RSSフィード

2017-11-05

★ in Selenium2 + Firefox + Python

import os
import time
import re
import pickle
from pprint import pprint
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys

sdatetime = datetime.now()
stime     = time.time()

driver = webdriver.Firefox()
driver.get('https://SR/')

cookies = pickle.load(open(os.path.dirname(os.path.abspath(__file__)) + "/cookies.pkl", "rb"))
pprint(cookies)
for cookie in cookies:
    driver.add_cookie(cookie)

driver.get('https://SR/onlive')
time.sleep(5)

rooms = driver.find_elements_by_xpath("//a[@class='js-room-link listcard-join-btn']")
pprint([x.get_attribute('href') for x in rooms])

official_rooms = [x for x in rooms if not re.match(r".+/[0-9a-f]+$", x.get_attribute('href'))]
pprint([x.get_attribute('href') for x in official_rooms])

MAX_OPEN = 25
windows = min(MAX_OPEN, len(official_rooms))
for i in range(windows):
	official_rooms[i].send_keys(Keys.CONTROL + Keys.RETURN)
#	driver.execute_script("window.open('%s');" % official_rooms[i])

s2datetime = datetime.now()
s2time     = time.time()

break_loop = False
for var in range(120):
	time.sleep(10)
	for i in range(len(driver.window_handles)-1):
		driver.switch_to.window(driver.window_handles[i+1])
		print(datetime.now(), end=" ")
		stars = driver.find_elements_by_css_selector('div.gift-free-num-label')
		cnt   = 0;
		for s in stars:
			n = re.search(r'\d+', s.text)
			if n:
				num = n.group(0)
#				if num == '99':
# 					cnt+=1
				print(num, end=" ")
			else:
				break
		print()
		if cnt == 5:
			break_loop = True
			break

	if break_loop:
		break

	driver.switch_to.window(driver.window_handles[0])

edatetime = datetime.now()
etime     = time.time()

print("Script start time     : ", sdatetime)
print("Collecting start time : ", s2datetime)
print("Collecting end time   : ", edatetime)
print("Elapsed               : ", etime-s2time)
driver.quit()

ハマったところとか色々

Selenium歴史も長そうだし枯れてるんだと思っていたけどクセがすごいし、Pythonは初めて使ってみたけどPerlに比べて面倒なことが多いし、微妙なかんじ。慣れですかね。

Python自体の話

Perlと比べた場合、Rに関しては明確なメリットがあったけど、Pythonは手間のかかるPerlという感じで今いちメリットが感じられなかったなあ。慣れですかね。あるいは必要ライブラリーPython用にしか提供されてないとか。

Seleniumの話

ブラウザ(Firefox/Chrome)の拡張と同じレベルのことを外部からできるものだと想像していたけど、予想以上に機能制限されてた。

ブラウザ操作という点では拡張スクリプトが最強だけど、sandboxでの実行になってしまったり、自動実行という点では今ひとつだったり、コードコールバック地獄になったり、それぞれメリットデメリットがあるみたい。

Seleniumで実行したブラウザから自作拡張を実行する、みたいなことが出来たらいいとこ取りなんだけどなあ。できてもよさそうなモノだけど。

TBD
いろいろ

Does python have a "use strict;" and "use warnings;" like in perl? - Stack Overflow

Python変数必要になった時点で割り当てるのでPerlにおけるstrict的な静的チェックはできない、ということか。

2番めのコメントにあるように、変なtypoで実行結果がおかしくなったり、途中まで処理が進んでからエラーで落ちたり、strict的なものがないと不便だと思うんだよなあ。そしてこの手のバグは非常に見つけづらい・・・

そんな変なコードを書くな?はい

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kkobayashi_a/20171105/p1