Pythonでやる奴

Python出来る→機械学習も出来る→価値UPで年収UPでやりがいUP→いつかは田舎暮らししたい男のブログ

スクレイピング - Seleniumを使う場合

Pythonスクレイピングをやる人、多いと思います。

私もそのクチでした。

ここでは、スクレイピングの中でも、実際にブラウザを動かして操作するSeleniumで、以下の操作を実現しました。


  1. Chromeを立ち上げyahoo.co.jpにアクセスする
  2. 検索窓に指定したキーワードを入力し、検索ボタンクリック
  3. 検索結果をタイトルとURLを取得する
  4. 3.の内容をファイルに保存する。(今回は、HTMLファイルに記録)

記事の最後に、躓いた所など書いています。

from selenium import webdriver
import urllib.parse

# 1.〜3.までの処理をsearch()に一括りにしました。
def search():
    browser = webdriver.Chrome()
    browser.get("http://yahoo.co.jp")

    elem_search_word = browser.find_element_by_id("srchtxt")
    elem_search_word.send_keys("半端ないって")
    elem_search_btn = browser.find_element_by_id("srchbtn")
    elem_search_btn.click()

    # 検索結果(Link)を取得 #〜〜はid要素、.〜はclass要素 その他はタグ要素
    links = browser.find_elements_by_css_selector("#WS2m .w .hd h3 a")

    # url取得
    html_output = {}
    for elem in links:
        # マルチバイトがあるのでデコード処理を入れておく
        url = urllib.parse.unquote(elem.get_property("href"))
        title = elem.text
        html_output[title] = '<a href="' + url + '">' + title + '</a><br>'
    write_file(html_output)
    browser.close()

# 取得した結果を画面表示するイメージで、htmlファイルに書き込みます。
def write_file(s):
    with open('search_rank.html', 'w') as f:
        f.write("<html>\n<head>\n")
        f.write("<meta http-equiv='content-type' charset='utf-8'>\n")
        f.write("</head>\n<body>\n")
        for k, v in s.items():
            f.write(k + ":" + v + "\n")
        f.write("</body>\n</html>")
        
# 実行
search()

出力されたHTMLファイル

<html>
<head>
<meta http-equiv='content-type' charset='utf-8'>
</head>
<body>
大迫半端ないってとは (オオサコハンパナイッテとは) [単語記事] - ニコニコ ...:<a href="http://dic.nicovideo.jp/a/大迫半端ないって">大迫半端ないってとは (オオサコハンパナイッテとは) [単語記事] - ニコニコ ...</a><br>
大迫 、ハンパないって!!フルバージョン - YouTube:<a href="https://www.youtube.com/watch?v=pZ2UIYRK5I4">大迫 、ハンパないって!!フルバージョン - YouTube</a><br>
【大流行】「大迫半端ないってゲーム」を作ったら盛り上がりすぎたw - YouTube:<a href="https://www.youtube.com/watch?v=8snezGmNVsE">【大流行】「大迫半端ないってゲーム」を作ったら盛り上がりすぎたw - YouTube</a><br>
大迫はんぱないbot (@osako_hanpa) | Twitter:<a href="https://twitter.com/osako_hanpa">大迫はんぱないbot (@osako_hanpa) | Twitter</a><br>
「大迫、ハンパないって!」発言の滝川二・中西隆裕主将の今 : スポーツ報知:<a href="http://www.hochi.co.jp/soccer/worldcup/CO034053/20180621-OHT1T50032.html">「大迫、ハンパないって!」発言の滝川二・中西隆裕主将の今 : スポーツ報知</a><br>
大迫半端ないって!の続きがさらに公開されたようなので書きおこしてみる ...:<a href="http://nakosan.com/?p=1297">大迫半端ないって!の続きがさらに公開されたようなので書きおこしてみる ...</a><br>
Good loser「半端ないって!!!」の中西隆裕さんの今 - NAVER まとめ:<a href="https://matome.naver.jp/odai/2139995039593566401">Good loser「半端ないって!!!」の中西隆裕さんの今 - NAVER まとめ</a><br>
「大迫半端ないって!」という名言でこの日を約束された未来にしてくれた ...:<a href="http://blog.livedoor.jp/vitaminw/archives/53284800.html">「大迫半端ないって!」という名言でこの日を約束された未来にしてくれた ...</a><br>
3 「大迫、半端ないって〜!」生みの親、職場から異例の ... - 週刊女性PRIME:<a href="http://www.jprime.jp/articles/-/12662">3 「大迫、半端ないって〜!」生みの親、職場から異例の ... - 週刊女性PRIME</a><br>
</body>
</html>

このHTMLファイルをブラウザで開くとこんな感じ

大迫半端ないってとは (オオサコハンパナイッテとは) [単語記事] - ニコニコ ...:大迫半端ないってとは (オオサコハンパナイッテとは) [単語記事] - ニコニコ ...
大迫 、ハンパないって!!フルバージョン - YouTube:大迫 、ハンパないって!!フルバージョン - YouTube
【大流行】「大迫半端ないってゲーム」を作ったら盛り上がりすぎたw - YouTube:【大流行】「大迫半端ないってゲーム」を作ったら盛り上がりすぎたw - YouTube
大迫はんぱないbot (@osako_hanpa) | Twitter:大迫はんぱないbot (@osako_hanpa) | Twitter
「大迫、ハンパないって!」発言の滝川二・中西隆裕主将の今 : スポーツ報知:「大迫、ハンパないって!」発言の滝川二・中西隆裕主将の今 : スポーツ報知
大迫半端ないって!の続きがさらに公開されたようなので書きおこしてみる ...:大迫半端ないって!の続きがさらに公開されたようなので書きおこしてみる ...
Good loser「半端ないって!!!」の中西隆裕さんの今 - NAVER まとめ:Good loser「半端ないって!!!」の中西隆裕さんの今 - NAVER まとめ
「大迫半端ないって!」という名言でこの日を約束された未来にしてくれた ...:「大迫半端ないって!」という名言でこの日を約束された未来にしてくれた ...
3 「大迫、半端ないって〜!」生みの親、職場から異例の ... - 週刊女性PRIME:3 「大迫、半端ないって〜!」生みの親、職場から異例の ... - 週刊女性PRIME


今回、ちょっと躓いた所

Q)chromedriverどこ置いたらええの?

A)パスが通っている所に置いたら大丈夫っぽいので私はanaconda3/binフォルダに置きました。

(参考)パスの確認はターミナルで以下を入力

echo $PATH

今後、リファクタリングしたり、DBにデータを保存したり、別の処理と連携してまた違うことをやってみたいと思います。。

ちなみに、今回このプログラムを思いついたのはクラウドソーシングの案件の中で、「指定したキーワードをyahooで検索して特定の順位のサイトURLを報告する(〜10円程度/件)」というのを見て、これ自動化したらめっちゃ儲かるんじゃね?って思ったから。(動機が不純)結局単価が低いのと、件数にも上限がありそうなので諦めましたが:D)

参考にしたサイト: www.inet-solutions.jp