一人合宿2日目
昨日は予定外に、Crawlerから作り直さないと行けない自体になり、それはそれでSeleniumの勉強になって楽しかった。 今日はそこは早々にかたづけて、以下のうち3つは終わらせたい!!
・(Doing)SeleniumをつかってClickしてたどる
・(未)containerつかったcrawlerを定期的にうごかしraw 議事録dataをFireStorageに格納
・(未)container raw dataから議員毎に解析をして 結果をfirestore に格納
・(未)ViwerWebApp 議会、議員を選んで表示する
・(未)巡回先のURLを増やせるようにする
1日目のできたところ
parpattern = '//*[@class="parent_bar"]/li'
childpattern = './/ul/li'
parentslen = len(browser.find_elements_by_xpath(parpattern))
for pi in range(parentslen):
pel = selectParent(browser, pi, parpattern)
if not pel:
break
print('p0:',pel.text,'--end--')
childlen = len(pel.find_elements_by_xpath(childpattern))
for ci in range(childlen):
cel = pel.find_elements_by_xpath(childpattern)[ci]
child_text = cel.text
print('c0:',child_text,'--end--')
if(not cel.is_displayed()):
actions = ActionChains(browser)
actions.move_to_element(cel)
actions.perform()
sleep(1)
cel.click()
sleep(1)
browser.save_screenshot('images/' + dtstr + child_text + '.png')
browser.back()
sleep(1)
selectParent(browser, pi, parpattern)
ひとつづつたどるときにClickが必要になるし、clickできるようにhiddenなドロップダウンリストをいちど親をクリックして開いてあげないといけない、リンクでなくjavascriptで処理されているので別ページでひらくということができず、いちいちbackで戻らないといけない、さらに戻るせっかく開いたものがまた閉じてしまうので再度開くからやり直さないといけないという、いけてないRPA的なコードになるのは今の所しかたないとしよう。
9:30-12:00
なんとか再帰的にcrawlしていくように拡張してこれでcrawler部分は一段落。
実装ポイント1.「もっと表示する」みたいなところを一回クリックしないと子要素が表示されないものがあるところへの汎用的な対応としてもっと表示する箇所を別途xpathで取得して最初にすべてクリックするようにした
2. 親要素をクリックしないと子要素がでてこないときに、すでにクリックされているかどうかを親要素から相対的なパスで子要素を取得してリストの長さで判定するようにした
3. is_displayed で表示されていない場合はclickしてはいけない
4. clickできるためにmove_to_elementでスクロールさせる
公開できるようにきちんとコメントあとで書こう
def deepClick(self, i):
print(self._xpaths[i])
[morepattern, parpattern, childpattern] = self._xpaths[i]
self.clickMore(morepattern)
parentslen = len(self._browser.find_elements_by_xpath(parpattern))
for pi in range(parentslen):
self.clickMore(morepattern)
pel = self.clickParent(pi, parpattern, childpattern)
if not pel:
print('pel is disapeared!!')
continue
print('p0:', pel.text, '--end--')
childlen = len(pel.find_elements_by_xpath(childpattern))
for ci in range(childlen):
child_text = self.clickChild(pel, ci, childpattern)
if len(self._xpaths) - 1 <= i:
self.save_contents(child_text)
else:
self.deepClick(i + 1)
self._browser.back()
sleep(1)
self.clickMore(morepattern)
pel = self.clickParent(pi, parpattern, childpattern)
if not pel:
print('pel is disapeared!!')
break
12:00-
いよいよ解析して、firestoreにつっこむところだ。
* 1. 解析のアルゴリズムをいままでの精度よかったものからきめる、場合によっては2段階にしてもよいかも。また何か特定のキーワードごとにまとめたほうが、後で見るときに便利そうだ。
* 2. 議会、議員毎にどのようなテーブル構造にするかきめる
1は時間かかるけど、2はそんなに難しくなさそうだ。
いやー、1のところで curpusにするところまではいいんだが、そこからsentensにText parseかけるところでうまくいくものといかないものの差がわからずにどはまりしています。 うーーん。
20:00-
うまくいくものと、いかないものを比較してみるとsummyに入力するためにおcorpusをdocumentに変換したときに、heading だけになってしまうか,senstenseとして認識されるかのちがいがあるらしい。色々調べるとどうやらSummyの仕様で全部大文字だとHeading行として理解されるとのこと。。日本語の処理はさらにtinysegmenterというものもかかわるのだが、多分たまたま英小文字がはいっているときと入らないときとでわかれているようだ。。 しょうがないので無理やり末尾に「Yes」といれることでなんとかsentenseと処理させることができた。。 うーーん。今日はここまでだった。はまったー。
def summarize_text(corpus, count):
# 連結したcorpusを再度tinysegmenterでトークナイズさせる
# 大文字だけだとHeading行とみる仕様がありSentenseとして見てもらうために小文字を挿入
corpus.extend("Yes。")
print('corpus============================\n', ''.join(corpus))
parser = PlaintextParser.from_string(
''.join(corpus), Tokenizer('japanese'))
print('parser============================\n', parser.document.paragraphs)
summarizerSB = SumBasicSummarizer()
summarizerSB.stop_words = [' ', '。']
summarySB = summarizerSB(parser.document, count)
この記事が気に入ったらサポートをしてみませんか?