Top/沼田/専門ゼミ



スクレイピング 

目標 

web上のサイトからURLの一覧を抜き出し、それぞれのURLにとんでデータを取得する。

実行環境 

インストール 

作業の流れ 

  1. 作業フォルダにcdしてファイルを作る
    code ファイル名.py
  2. 作ったファイルの実行
    python3 ファイル名.py

具体的な手順(Javascriptなし) 

スクレイピングしたいサイトがJavascriptで構成されているかレンダリングする前のソースを表示して確認する。(≠F12)

ブラウザで
ctrl+U

実際のニュースページに書かれている内容が書かれているか文字列を検索する。

検索のやり方
ctrl+F

Javascriptの場合=>具体的な手順(Javascriptあり)へ

Javascriptがないサイトとして、今回は技術評論社の電子書籍サイトを使ってスクレイピングしていく。 このサイトは、本の一覧が表示されていて、気になる本をクリックするとその本の価格と内容が表示されるようになっている。
スクレイピングするのは、すべての本の遷移先URLと本のタイトル、価格、内容である。

スクレイピングするのにあたってのおおまかな手順としては、本の一覧ページからそれぞれの本の遷移先URLをすべて取得する。 そしてそれぞれのURLにアクセスしてその本に関する情報をスクレイピングする、という流れ。

  1. 本の一覧ページからすべての本のURLの取得
    添付ファイルの画像

    request.getでメインのURLのレスポンスをもらい、scrape_list_page(response)関数を使って指定されたid内のURLを取得している。
    root.make_links_absolute(response.url)とすることで、すべてのリンクを絶対リンクに変換できる。
    ・セレクタの指定方法
     ○idを指定するとき
    cssselect('#id')
     ○classを指定するとき
    cssselect('.class')
     ○idまたはclass内のタグ指定するとき
    cssselect('#id(または.class) (タグ)')
  2. それぞれのURL先のデータを取得
    添付ファイルの画像

    ここでは、それぞれの得たURLをfor文でレスポンスをもらいscrape_detail_page(response)関数でレスポンスに対する処理を行っている。ebookは辞書(dict型オブジェクト)でurlやtitleなどの情報名(key)とそれに対する値(value)を1対で持ち合わせている。
    また、複数のページをクロールするのでリクエストする際はsessionを使う。

具体的な手順(Javascriptあり) 

次に、Javascriptを使う場合について説明する。 Javascriptをがある場合、seleniumとphantomJSを追加でインストールする。phantomJSのサポートが終了したのでHeadless Chromeを使う。

  1. ニュースの一覧ページからすべてのニュースのURLの取得
    添付ファイルの画像
    今回はHeadless Chromeを用いているので、レスポンスをもらうときはrequest.getではなく、driver.getとする。
    また、今回のページでは沙録、詳細文が一文づつタグ分けされていたのでfor文を回してつなげている。
    さらに、出力するときに文字コードが変わって改行が\u3000と出力されてしまっていたのでそこを無白に置き換えている。 実行するとリクエストを使った場合と比べて、Headless Chromeは実行時間が長かった。そこで、URL取得部分はJavascriptが使われていなかったので、そこはリクエストを用いることにして次の手順を進める。
  2. それぞれのURL先のデータを取得
    添付ファイルの画像
    URLの一覧取得後、Headless Chromeを立ち上げてfor文で情報を得ていく。出力時にurlの値がうまく渡せなかったのでurlをglobal変数としている。

最後に 

出力結果をテキストとして残したい場合は

python3  (ファイル名).py >  (ファイル名).txt

とすることでテキストファイルに実行結果を出力できる。
上のコードの実行結果
技術評論社の電子書籍サイト

添付ファイルの画像

Bloomberg


また詳細ページなどの文が別れている場合、今回はfor文を使って指定のタグを見つけ次第繋げているが、あらかじめ文のリスト作りjoinという変数を使ってそれらを繋げるという方法もある。以下例。

>>> list = ['a', 'b', 'c']

配列をこのようにつなげたい→ abc

>>> ','.join(a)
'a,b,c'
>>> ','.join(list).replace(',','')
'abc'

スマホ加速度センサー 

Node.jsのインストール 

  1. Node.jsインストーラーを以下のリンクよりダウンロードする。
    https://nodejs.org/en/download/
    Windows(64-bit)の場合は、以下の画像の赤線で囲んだものをクリックする。
    node_example1.png
  2. インストーラーを展開し、インストールを行う。
    途中でライセンスに同意し、Nextをクリックしていくと、Node.jsのインストールが完了する。
  3. インストール出来ているか確認する。
    コマンドプロンプトからインストールされたNode.jsとnpmを確認する。
    以下の画像のように、コマンドプロンプトを開く。
    node_example2.png
    そして、以下のコマンドより、Node.jsが入っていることとバージョンを確認する。
    node --version
    node_example3.png
    同様に、以下のコマンドより、npmが入っていることとバージョンを確認する。
    npm --version
    これで、node.jsは使える。
    しかし、Javascriptを使ったことないと難しいかもしれない。

サンプルプログラムの使い方 

上記のzipを展開し、コマンドプロンプトで展開したディレクトリにて、以下のコマンドで、サーバーが立ち上がる。

node server.js

ここで一度終了しておく。終了するにはCtrl+Cを押す。

スマートフォンから接続 

まず、スマートフォンとパソコンが同じ回線につながっていることを確認する。
次に、パソコンのコマンドプロンプトにてパソコンのIPアドレスを調べる。
windowsならば以下のコマンドで確認できる。

ipconfig

コマンドを入力し、以下の赤線のIPアドレスを覚えておく。

node_example4.png

次に、サンプルプログラムの中のindex.htmlをエディタで開き、赤線で囲んだリンクを先ほどのIPアドレスに変更する。

node_example5.png

ここで、またサーバーを立ち上げる。
そして、自分のスマートフォンにて、先ほど変更したリンクに接続すると、加速度が取得できる。
また、パソコンで同じリンクに接続すると、加速度が確認できる。
そのままのプログラムでは、コマンドプロンプトに、スマホの加速度がx軸、y軸、z軸の順に半角スペース1つ分あけて表示される。
であるから、コマンドプロンプトにて、

node server.js > a.txt

もしくは

node server.js > a.csv

などと入力すると、以下のようなテキストファイルが完成する。

node_example6.png

これらのファイルを使用してgnuplot等で、グラフ化することもできる。

node_example7.png

また、他のセンサーを使いたい場合は、server.jsやindex.htmlを書き換えて使うことができる。今回動作させたのはすべてもともとjava scriptにあるdevicemotionイベントを用いたもののみを使っているが、ほかのWEB上のAPIを用いることでさらにセンサーを増やすことが可能。

追加したセンサー https://ics.media/entry/4095#devicemotion グラフ化 https://github.com/misohena/js_deviceorientation

バイブレーション https://davidwalsh.name/vibration-api 追加

GPSセンサー http接続からの取得が禁止されていた https://www.atmarkit.co.jp/ait/articles/1605/13/news038.html

照度センサー 近接センサー このAPIはブラウザによって無効化された https://www.fxsitecompat.com/ja/docs/2018/ambient-light-and-proximity-sensor-apis-have-been-disabled/

ジャイロセンサー(傾き)もとからあった ジャイロセンサー(方角)方角を追加

加速度センサー(慣性)重力を含む加速度の追加

重力なし加速度や回転速度は、追加したものと似ているため追加していない

server.jsでコマンドプロンプトに表示させるallとgallを並べて表示させたかったが、devicemotionイベントは常に値を とり続けるのに対してdeviceorientationイベントは値が変化したら実行されるからそれぞれの値を並べて表示できていない

サーバー側でコンパスの値は取得しているのに、コンパスの向きがPC側だと変化しない グラフも同様で値の通信はできているのに、PC側だと変化しない

通信の流れ http://jxck.hatenablog.com/entry/20110730/1312042603

sumahosens.jpg

参考:http://blog.infosign.co.jp/blog/member/akazawa/616/


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS