yahooで3.11をひたすら検索するやつ


動機

今日(2019/03/11)で東北大震災から8年。自分はその時小学校を卒業を控えていてテレビから流れる映像を覚えている。自分ができることはなにもないが、何もやらないより何かしたほうがいいと思いやってみる。

なにをするのか

yahooで3.11と検索すると10円寄付されるらしい。(以下参照)
https://fukko.yahoo.co.jp/
簡単に言うと検索すると10寄付されるらしい(本当か?)

yahooの検索エンジンで3.11と検索するプログラムを作ってみようと思う

問題点

中身の仕組みを調べる時間がないために中身の仕組みがわからない

  • 検索数 × 10円 で計算している
  • 一人一回限り
  • その他

仕組みはよくわからないが、とりあえず一回検索することで10円入ると仮定して話を進めることにする。

環境について

  • プログラム言語
    • python3.6
  • 使用ライブラリ
    • selenium

こんな感じかな
seleniumは少し設定がめんどくさいが各自で検索してやってみてください。

大まかな流れ

1. seleniumでyahooの検索画面を開く
2. 検索部分に[3.11]を入力
3. 検索を押す
4. 画面が読み込まれるまで待機
5. 読み込み終了したら1.に戻る

こんな流れでやってく

プログラムについて

インポートと変数

seleniumを使う

3.11.py
from selenium import webdriver 

#以下の部分は待機に必要なやつ
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

seleniumの設定

環境によって違うと思うが各自調べてほしい
使うDriverによって変わってくるので丸コピでは動かないと思います。
今回はChromeを使うのでよろしく

3.11.py
driver = webdriver.Chrome(path)

pathは各環境で変わるはず・・

yahooの検索画面の表示

yahooのURLを変数に格納して使う
https://www.yahoo.co.jp/

3.11.py
url = "https://www.yahoo.co.jp/"

driver.get(url)

これでウィンドウが開く

検索を入力

検索バーに文字列を入力する。

検索部のhtmlは

yahoo_Searchbox.html
<input name="p" id="srchtxt" type="text" value="" autocomplete="off">

こんな構造らしい

  • name = "p"
  • id="srchtxt"

以上の2つが使えそうなので使う
今回は被ってないのでidを使う

3.11.py
Search = driver.find_element_by_id("srchtxt")
Search.send_keys("3.11")

これで検索部に[3.11]が入力される

検索ボタンを押す

文字列を入力した後には検索ボタンを押さなければならない

ボタンのHTMLの構造

Search_button.html
<input type="submit" id="srchbtn" class="srchbtn" value="検索">
  • id = "srchbtn"
  • class = "srchbtn"

2つが使えそう、これも被ってないのでidを使う

3.11.py
driver.find_element_by_id("srchbtn").click()

これで検索される。画面が移動すれば成功

画面が読み込まれるまで待機

上記の画像が表示されるまで待つ方法を考える。
構造は以下の感じ

3.11_image.html
<div class="hd">
<h3 class="anm1 cvs17Fadein" style="background-image: url(&quot;https://s.yimg.jp/images/search/311/2019/pc/311heart2.png&quot;); opacity: 1;">
<a href="javascript:void(0)">3.11、検索は応援になる。 Search for 3.11 2019.3.11</a>
</h3>
<p class="cnt anm2">
<span><span class="ht cvs17Bounce" style="opacity: 1;"></span><span class="num cvs17Fadein" style="opacity: 1;">3,212,622</span></span>
</p>
</div>

classがあるのでそれを使うかな

3.11.py
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "hd")))

これで、待機は完了

参考
https://kurozumi.github.io/selenium-python/waits.html

繰り返し

以上のプログラムを繰り返し行うようにすればひたすら検索するプログラムの完成
無限ループを作ればいいはずなのでfor分やwhile分をうまく使えばいいはず

最後に

朝(昼)に起きたら、ツイッターのタイムラインが3.11に関してのツイートが多くこのプログラムの案を考えついた。何に使えるかわからないが、何かの役に立てばいいと思いプログラムを書いて少しだけ細かく書いてみました。
一時間ちょっとで考えているので、説明不足なり間違ったコードを書いていたりもう少し簡単に書けるところがあると思います。教えてくださいお願いします。
あれから八年、何かの手助けができればいいですね。
お疲れ様でした。

code

3.11.py
from selenium import webdriver 

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def main():
    driver = webdriver.Chrome(path)
    url = "https://www.yahoo.co.jp/"
    driver.get(url)

    Search = driver.find_element_by_id("srchtxt")
    Search.send_keys("3.11")

    driver.find_element_by_id("srchbtn").click()

    WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable(
            (By.CLASS_NAME, "hd")
            )
        )

    driver.close()

if __name__ == "__main__":
    while True:
        main()

後はいい感じにアレンジしてください
時間で指定する、回数をしてい、何回検索したか表示いろいろ出来ると思います。