2017-10-01

【Python】スクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ~Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた~




この数年間、Pythonの人気が高まっています。Googleトレンドによると、Pythonの検索流入数は、この10年間で2倍近くになりました。特にグラフから見ると、だいたい2015年ぐらいからPythonの検索数は増えている模様です。




さて、この数年間で、Pythonがどのような言語として扱われ、どう変化してきたののでしょうか。Webスクレイピング→データ収集→整形→分析を行い、今回は、2006年度から2017年度までのはてなブックマーク上のPython記事で、50ブックマーク以上の記事をすべて取得することによって、時代によってブックマークされやすいPython記事を分析してみようと思います。


そのためには、(1)データの取得と(2)データの分析、そして最終的に(3)結果のレポートにわけて、分析を進めていきたいと思います。


目次



  • データ分析のケース
  • 環境
  • 1. データの収集: SeleniumとPandasでスクレイピング結果をCSVに書き込もう!
  • 2. データを分析しよう: Jupiter NotebookとPandasで対話的な分析!
  • 3. データ分析結果をレポートする
  • 4. 最後に





データ分析のケース


以下の成果物を想定して、データ分析を行います。

  • あなたはPythonエンジニアで、ブログを書いています。
  • あなたはあわよくばPythonブロガーとして、アフィリエイト収入で生きていきたいと思っています。そのため、はてな受けする記事を書きたいと思っています。
  • バズりやすいPython記事のトレンドを分析し、バズりやすいタイトルを決めようと考えています。
  • そこで、Pythonの人気記事のトレンドを過去10年間分析することにしました。
  • 最後に、2017年度に特にブックマークされた記事をもとに、タイトルを分析し、拡散しやすいブログタイトルをレポートとして提出します【成果物】

環境


  • Windows10
  • データ取得まではCloud9を利用
  • データ分析ではAnacondaを利用


1. データの収集: SeleniumとPandasでスクレイピング結果をCSVに書き込もう!


データに関しては、

(1)Pythonが関係する記事のタイトル(title)
(2)発行日時(date)
(3)ブックマーク数(bookmarks)


を取得したいです。今回はこれを、2006年から2017年度までのデータをスクレイピングで取得し、そのデータをCSVファイルに書き込むコードを書いてみたいと思います。はじめに、csvデータにタイトルだけつけて保存しておくことにしました。

アルゴリズム


今回は、はてなブックマークでPythonに関する記事を取得してみたいと思います。コードを書く前に、だいたいのアルゴリズムを考えました。

  • はてなブックマークではてぶ数50以上・Pythonと検索した結果ページを表示
  • CSVデータを開き、書き込み準備を行う
  • 以下の条件のとき、繰り返しの処理を行う
    • もし、ページネーションボタンで「次の40件」が存在する場合
      • 記事データをすべて取得する
        • それら一つ一つを取り出す
        • 各ページのタイトル・更新日時・ブックマーク数を取得する
        • それを1行にまとめ、行列に追加する
        • 最後の記事まで繰り返す
      • 「次へ」ボタンのリンク先へ飛ぶ
      • 記事データの取得まで戻る
    • もし、ページネーションが存在しない場合
      • 繰り返し処理を終わらせる
  • 取得した全データをCSVに書き込み、処理を終わらせる

コード


  • スクレイピングにSeleniumを利用
  • CSVの読み込み、書き込みにはPandasを利用
  • スクレイピングのマナーとして、待つためにTimeを利用


実際のコードがこちら。さきほどのアルゴリズムどおり記述してあります。


from selenium import webdriver  
from pandas import * 
import time

#Access to page

browser = webdriver.PhantomJS()  # DO NOT FORGET to set path
url = "http://b.hatena.ne.jp/search/text?safe=on&q=Python&users=50"
browser.get(url)
df = pandas.read_csv('trend.csv', index_col=0)

#Insert title,date,bookmarks into CSV file

page = 1 #This number shows the number of current page later

while True: #continue until getting the last page
    if len(browser.find_elements_by_css_selector(".pager-next")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")
        #get all posts in a page
        posts = browser.find_elements_by_css_selector(".search-result")
        
        for post in posts:
            title = post.find_element_by_css_selector("h3").text
            date = post.find_element_by_css_selector(".created").text
            bookmarks = post.find_element_by_css_selector(".users span").text
            se = pandas.Series([title, date, bookmarks],['title','date','bookmarks'])
            df = df.append(se, ignore_index=True)
            print(df)

        #after getting all posts in a page, click pager next and then get next all posts again
        
        btn = browser.find_element_by_css_selector("a.pager-next").get_attribute("href")
        print("next url:{}".format(btn))
        browser.get(btn)
        page+=1
        browser.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
    else: #if no pager exist, stop.
        print("no pager exist anymore")
        break
df.to_csv("trend1.csv")
print("DONE")


それで、このファイル()を実行しますと、以下のGIF動画のように、データを取得できます。

$ python trendAnalytics.py




こちらが過去11年分のPythonブックマークデータがつまったCSVファイルですね。




2. データを分析しよう: Jupiter NotebookとPandasで対話的な分析!


さて、データを持ってこれたので、ここからデータの分析をしてみたいと思います。
取得したデータを、Jupyter NotebookPandasで分析してみましょう。(ちなみにCloud9でJupyter Notebookを利用しないのは、うまく環境が作れなかったためです)


まずはJupyter Notebookで、CSVを読み取ります。headメソッドを使うと、上から何個か勝手に取得してくれるので、正常にデータが入ったか確認することができます。


from pandas import *
df = pandas.read_csv("trend1.csv")
df.head()





どうやら、'Unnamed:0'という無駄な列が存在しますね。これはpandasの関係で無駄なindexが追加されてしまったみたいです。削除しましょう。

df.drop(['Unnamed:0'], axis = 1) #axis = 1は、列、axis = 0は行を指定する
df.head()





では、取得できた最後の年度である、2006年度のデータを取得します。こちらは、2006年度を文字列に含む行でかつ、NAが存在しないものだけを取得します
そして、さらにブックマーク数が多い順に並べてみます。


year2006 = df[df["date"].str.contains("2006/", na=False)] #NaNでデータは無視
year2006.sort_values(by=["bookmarks"], ascending=False)




ふ~む、どうやらこの時はRuby、Perlと同列に語られていて、どっちかというと新しいWeb言語として注目されはじめているんでしょうか。また、入門系の記事がトップに存在します。最大ブックマーク数が782、それ以外は365くらいです。そんなに盛り上がっていないようです。



さて、今度は2010年度を見てみましょう。


year2010 = df[df["date"].str.contains("2010/", na=False)]
year2010.sort_values(by=["bookmarks"], ascending=False)





やっぱり入門系の記事がランクインしています。入門系の記事って、初心者でも書きやすいし、需要もあるんですかね。この時代には機械学習系の記事やスクレイピングの記事が一切存在しません。


さて、お次は2013年を見てみます。

year2013 = df[df["date"].str.contains("2013/", na=False)]
year2013.sort_values(by=["bookmarks"], ascending=False)




やっと機械学習関係の記事が出てきました。また、Webフレームワークが結構多いですね。このころはWeb言語としてのPythonという認識だったのでしょうか。少しブックマーク数が下がっていますね。


さて、それではPythonの検索数が増え始めた2015年度のデータを分析してみましょう。


year2015 = df[df["date"].str.contains("2015/", na=False)]
year2015.sort_values(by=["bookmarks"], ascending=False)



ほおぉ、面白いですね。この年になると、ディープラーニングビッグデータデータ分析機械学習という、データサイエンスブームにのったキーワードがブックマークされています。そして初心者向けの記事もあいかわらず人気ですね。ブックマーク数も底上げされてきている感じがします。




さて、目標だった2017年度を見てみましょう。どういう傾向なのでしょうか。


year2017 = df[df["date"].str.contains("2017/", na=False)]
year2017.sort_values(by=["bookmarks"], ascending=False)





めっちゃ盛り上がってますね、Python笑 実際にはてなでもはやってきているのだと思います。ブックマーク数1000越えが現れてきました。ブックマーク数がかなり上がってきています。人口も増えているのでしょうか。


特に、キーワードとしてはスクレイピングディープラーニング自動化最適化機械学習などのデータサイエンス領域、さらに初心者向けの環境構築方法や書籍関係の記事がバズっています。



3. データ分析結果をレポートする



さて、データ分析の結果、以下のことが分かりました。


  • どの年度でも、初心者向けの記事がはやりやすい
  • 「まとめ」ははやりやすい
  • 2015年度以降は、自動化・スクレイピング・データ分析などのデータサイエンスよりのキーワードがはやっている

ということで、想定するユーザーペルソナは

  • データサイエンスに興味がある
  • でもPythonは初心者である
  • これからデータサイエンス領域を学習をしたいと思っていて、効率的に勉強したいからまとめを読みたい
  • Webデータをスクレイピングして分析したり、自動化してみたいと思っている

という相手に向けたタイトルにしたいと思います。タイトルは最初のほうが重要なので、メリット(Webスクレイピング・データ収集・整形・分析)を提示し、次に対象(初心者)を書きます。さらにバズキーワードである、「まとめ」と「初心者」を追加し、今回の記事のタイトルを決め、「データ分析の結果、こういうタイトルがいいんじゃないですなかねぇ」と報告します。

【Python】Webスクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ~Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた~

最後に


正直、この記事読んでもよくわからない!」という人は、以下の記事に書いてある基礎を押さえれば、わりと簡単にこのレベルのことはできるようになりますので、ぜひ参考にしてください。(ちなみに筆者はPythonを学習し始めて4カ月程度です)

【Python】Pythonで遊んだAPIまとめ - DMM ・ Tinder ・ Twitter ・ Slack -

こんにちは、 アダルトサイエンティストのDAI です。会社ではJavaを書かなければならないのにもかかわらず、三大欲求に負けてPythonでエッチなことにしこしこ励んでいる毎日です。 僕のPythonデビューは2017年6月でした。 今では立派にDMMのAPIを利用して自分専用のエッチなBotをつくり、徐々にアダルトサイエンティストとしてキャリアを形成してきました。 ...

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...