【Python】サイトの文書を保存する(スクレイピング)

Pythonでデータを収集してみます。

今回は、自分の別ブログ「愚公は引越しました」の文書を保存するスクレイピングを行っていきます!

得られた文書は、形態素解析などの自然言語処理に使用する予定です。

スクレイピングの実装

requests, Beautiful Soupなどのライブラリもありますが、今回はSeleniumを使用し、ブラウザ経由でスクレイピングします。

サイトによっては、スクレイピングが明示的に禁止されています(Twitter,Wikipediaなど)。
たとえ禁止されていなくても、処理によってサーバーに負荷をかけ過ぎるとと、業務妨害罪に問われる可能性もあります。
十分に注意して運営してください。  

サイトの構造を把握する

コードを書く前に、「愚公は引越しました」の構造を確認します。

タイトル,見出し,本文から構成されており、ページ下部に「次ページに移動」リンクがあります。これは全ページ共通です。

サイトを全ページを巡ってスクレイピングするために、「次ページに移動」のリンクを使用することにします。

サイトを巡る処理

最新の記事から、投稿日時がもっとも古い記事までページを巡るコードを書いてみます。

セクションごとに説明していきます。


この部分では、使用するブラウザと、スクレイピング開始ページを指定しています。

ブラウザにはChromedriverを使用しています。他にはPhantomJSなどが有名ですね。

実行ディレクトリに置くか、別ディレクトリに置いてPathを通してください。


「次ページに移動」のXPathです。

確認したい箇所で右クリックして、「検証」を押すと 要素を簡単に確認できます。

「次ページに移動」の箇所は 、「next np-post-list」クラス となっています。

Selenium のメソッド、find_element_by_class(name) 使用し、name に「next np-post-list」を選択することで、「次ページに移動」を抽出できそうです。

しかし、find_element_by_class() はクラス名に空白が含まれるとエラーを出すようです。

「next np-post-list」の空白を除き、部分名「np-post-list」でも検索可ですが、「前のページに移動」部分が「prev np-post-list」クラスとなっており、「np-post-list」では名前が重複してしまいます。(要素が複数ある場合は最初に検索されたものが適用されます。

そのため、今回はXPathを使用することにしました。

対象箇所で、右クリック > Copy から CSSセレクタ,XPathがコピーできます。


いよいよ実行部分です。

最初に、ini_url をブラウザで開きます。

next_page_url には ini_url を入れておきます。


最終ページまで、処理をループさせるwhileループです。


最終ページまで到達したときの処理です。

ブラウザを閉じ、ループを抜けます。


次ページに移動する処理です。

next np-post-listクラス、<a>タグの href 属性が次ページのURLとなっており、 next_page_url に代入しています。

次ページに移動した後に、サーバー負荷の軽減のため1秒待機しています。


実際に動作させてみます。

ページがどんどん更新されています!

サイト上を移動する処理ができました。

文書の保存

ページごとに、文書を保存していきます。

追加した箇所のみ抽出します。


ソースを見ると「entry-content cf」クラスの、<p>タグに本文が書かれていることがわかりました。

ページ内の該当する要素をすべて、all_sentence_list[] に格納しています。


all_sentence_list[]から一文ずつテキストを抽出し、データベースに保存しています。

途中の if文は、どうしても本文に含まれてしまった「目次 [非表示]」と、文字数が1字以下となる文の除外です。


最後に、output.csv という名前のファイルに保存しています。

中身はこんな感じ↓

サイトから本文を保存することができました!

最後に

スクレイピングで、サイト内の文書の保存ができました。

せっかくなので、取得したデータをもとに色々やってみようと思います。

形態素解析,頻出単語順にソート,マルコフ連鎖による文書生成などなど…

次回をお楽しみに!