Seleniumを使ったスクレイピング

えー以前からUdemyと呼ばれるオンライン学習プログラムで勉強する為に色々と教材を買っていましたが、買ってそのままというのが常態化してきたので最近消化し始めました今日この頃です。

なので今回はUdemyで学習したことを書こうと思います!

Seleniumを使ってスクレイピングします!

と言うことで、タイトル通りスクレイピングします。
しかも今回はJupyter Notebookを使ってみました!
以前にJupyter Notebookをインストールしてそのまま放置してたやつですね。。。

ではでは早速Jupyter Notebookを起動してみます。

Jupyter Notebookの起動

以下のコマンドで起動してみる。

$ jupyter notebook

するとブラウザが立ち上がり以下の様な画面が表示される。
これで起動は完了。

f:id:kyamisama:20181201223353p:plain
Jupyter Notebook起動画面

Jupyter Notebookのワークディレクトリの作成

デフォルトで”Untitled Folder”ってフォルダ名がありますが、今回は別途作業フォルダを作成します。
作成方法はとても簡単で下記図の通り、左端の”NEW”と言うタブから”Folder”をクリックする事で新規でフォルダを作成できます。

f:id:kyamisama:20181201223932p:plain
New Create Folder

作成するとこんな感じ↓
”Untitled Folder 1”ってのが新しくできると思います。

f:id:kyamisama:20181201224207p:plain
New Create Folder2

フォルダの名前を変更したければ、ゴミ箱マークの横に”Rename”ってあるのでそこから変更できます。

Seleniumを使ったスクレイピング

作業フォルダも出来たので次に実際にPythonのコマンドを書いていく作業ファイルを準備します。
作業フォルダを作成した方法と同様に”New”→”Python [Root]”をクリックします。

f:id:kyamisama:20181201224717p:plain
New Create Work File

すると新しくブラウザタブが追加されます。基本的にはこの新しく追加されたページで作業を行います。
今回は練習みたいなものなので比較的スクレイピングがやり易いページから情報を取得したいと思います。
よくあるランキングサイトからのスクレイピングをやってみたいと思います。

ランキングサイトからの情報を取得する

今回はスクレイピングさせて頂くWebサイトはこちら
[ランキング] 頂上決戦!一番うまいインスタント袋麺ランキング1位から10位|サッポロ一番,うまかっちゃん,チキンラーメン|他 - gooランキング

インスタントラーメンのランキングサイトから以下の3つの情報を取得してみます。

  • 順位
  • 商品名
  • 投票数

まずは、Seleniumをインポートします。ちなみにこれを動作させるとGoogle Chromeが起動します。

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://ranking.goo.ne.jp/column/5524/ranking/51628/')

次に、順位のみを取得します。

all_rank = []
elem_rank = browser.find_elements_by_class_name('ranking-number')
for rank in elem_rank:
    elem_rank = rank.text
    all_rank.append(elem_rank)
all_rank

f:id:kyamisama:20181201230422p:plain
Ranking

そして、商品名の取得。

all_name = []
elem_name = browser.find_elements_by_class_name('hdg')
for name in elem_name:
    elem_name = name.text
    all_name.append(elem_name)
all_name

f:id:kyamisama:20181201230526p:plain
Product Name

最後に投票数の取得。

points = browser.find_elements_by_class_name('article-meta')
all_point = []
for _point in points:
    point = _point.text
    all_point.append(point)
all_point

f:id:kyamisama:20181201230817p:plain
Ranking2

これで3つの情報を取得できました。
ただ取得した情報がバラバラだと味気ないのでこの情報を合体させたいと思います。

最後に取得した情報をCSVに纏めて保存

それぞれ取得した情報をPandasを使って綺麗に整理して保存してみます。

import pandas as pd
df = pd.DataFrame()
df['ランキング'] = all_rank
df['商品名'] = all_name
df['投票数'] = all_point
df

f:id:kyamisama:20181201231221p:plain
Export to CSV

以上でSeleniumを使ったスクレイピング終了です!
思ってたより上手にスクレイピング出来たんじゃないかと思います。
実はスクレイピングで取得してみたい情報があるので完成した際にはここでお披露目出来ればと思っています。
またUdemyも素晴らしいWeb教材です。
たまに90%OFFセールをやっているのでその時はお買い得ですので、興味のある方は是非やってみてください。

bash使用時のシングルクォーテーションとダブルクォーテーションの違いについて

今日の業務中にRESTコマンドを叩くBashスクリプトを書いていた際に、少し手間取った箇所があったので戒めとして残します。
まぁ簡潔に言えば、Bashスクリプト内の「"」と「'」の動作の違いを知らなかったと言うお話です。

分かりやすい様にサンプルコードを用意してみました。

localuser$ cat test.sh 
test="pwd"
echo "$test"
echo '$test'
echo `$test`
localuser$ sh test.sh 
pwd
$test
/Users/
localuser$ 

変数testをechoで画面出力する方法として、変数testを「"」「'」「`」の3種類で囲い実行してみた結果です。
結果は見ての通り、「"」は変数の中身を出力、「’」は文字列として出力、最後の「`」は変数の中身をコマンドとして実行しています。
とても勉強になりました。これでもう間違えない!

QFX5100から設定コンフィグを自動取得する方法

常日頃の業務でNW機器の設定を行なっているとちょっとした作業を自動化できれば業務の負担が減るのになぁ。。。と思い始めて早1ヶ月
今回はNW機器から自動で設定コンフィグを取得するPythonスクリプトを作ってみたのでその辺のメモ書きを残します!

NWの自動化なんてググればすぐ見つかる情報なのでまずはググってみた。
こちらの記事はとてもわかりやすく丁寧な内容だった為、参考にさせていただきます。
qiita.com

参考記事によると、NETCONFなるものを使ってNW機器の情報を取得するようですね。。

NETCONFとは

マルチベンダーに対応しており、NW機器の情報を取得するプロトコルだそうです。
主要どころのベンダーだとCisco、Juniper、Arista、Brocadeが対応しているそうです。

NETCONFを使ったスクリプトコード

検証端末PCがWindowsなのでコンフィグファイルを保存するパスがWindows仕様になっています。
またPythonのバージョンは3.6.5でWindows OSは7です。

from ncclient import manager

username = 'admin'
password = 'admin'
ipv4 = '192.168.2.x'
port = 22

connection = manager.connect(host = ipv4, port = port, username = username, password = password, timeout = 20, device_params={'name':'junos'}, hostkey_verify=False )

print('1. run show command')
print('='*40)

config=str(connection.command('show configuration',format="text"))
print('='*40)
config2=str(connection.command('show configuration | display set',format="text"))


file="C:\\Users\\Desktop\\log.txt"
with open(file,"a")as f:
    f.write(config)
    f.write(config2)

たったこれだけの行数で見事に設定情報を取得する事ができました!
これでわざわざSSHしてコマンドを打つ手間が省けますね。

と言う訳でここまで駆け足で過ぎて行きましたが、詳細については参考にさせて頂いた記事をご覧になってください。

2019/05/26 更新

業務で複数台のQFXのコンフィグを取得する為に書いたコードです。
基本的に最初のコードをベースにして書いています。
ポイントとしては、コンフィグを取得したい機器のIPアドレスを別のテキストファイルに用意し
そこから読み込ませるようにしています。

それから機器に接続出来なかった場合のエラーハンドリングもtry exeptで実装してあります。

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import datetime
import traceback
from ncclient import manager

def net_conf_qfx(DUT_ipaddress):
 username = '***'
 password = '***'
 ipv4 = DUT_ipaddress
 port = 22
 
 now = datetime.datetime.now()
 try:
     connection = manager.connect(host = ipv4, port = port, username = username, password = password, timeout = 20, device_params={'name':'junos'}, hostkey_verify=False )
     config=str(connection.command('show configuration',format="yaml"))
     config2=str(connection.command('show configuration | display set',format="text"))
     file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\config_log\\{0:%Y%m%d%H%M}_{1}.txt".format(now,ipv4)
     with open(file,"a") as f:
         f.write(config)
         f.write(config2)
 except:
     file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\config_log\\{0:%Y%m%d%H%M}_{1}_SSHError.txt".format(now,ipv4)
     with open(file, 'a') as f:
        traceback.print_exc(file=f)

file="C:\\Users\\*****\\Desktop\\python\\netconf\\netconf_QFX\\qfx_list.txt"
with open(file,"r") as address_list:
    address = address_list.readlines()
for list in address:
net_conf_qfx(list.rstrip('\n'))

Cisco Nexus 9Kに公開鍵認証を使ってログインする方法

業務でCisco Nexusに公開鍵認証を使ってSSHログインする事があったので
その時の手順を残します。

ログイン元サーバにて秘密鍵と公開鍵の生成を行う

今回は自分のmac bookからログインするのでターミナルを起動して
下記コマンドにて秘密鍵と公開鍵の生成を行った。

MacBook-pro:~ localhost$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/localhost/.ssh/id_rsa): 
Created directory '/Users/localhost/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/localhost/.ssh/id_rsa.
Your public key has been saved in /Users/localhost/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tYBWM80VZu2yXdGnodiFH/vZJkH64mmd16D5MNKLvKY localhost@MacBook-pro.local
The key's randomart image is:
+---[RSA 2048]----+
|        +o .=+  .|
|       o ooo. *.o|
|      o . .o B =o|
|     .   o..= * .|
|        S .  = +o|
|           .o =.+|
|          ..+* =.|
|         ..o*+o o|
|        Eo+o.... |
+----[SHA256]-----+
MacBook-pro:~ localhost$ 

すると下記ディレクトリに二つのファイルが出来ている。

MacBook-pro:~ localhost$ ls /Users/localhost/.ssh/
id_rsa		id_rsa.pub

id_rsa秘密鍵でid_rsa.pubが公開鍵だ。
生成された公開鍵をcatコマンドで確認する。
※2048obit長で生成しているので鍵の長さを省略している。

MacBook-pro:~ localhost$ cat /Users/localhost/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local

Nexusで公開鍵の登録を行う

最後にNexus側で公開鍵の登録を行って完了だ。
ここで登録するユーザを間違えないように注意する。
実際にNexusのadminユーザに公開鍵を登録してみる。

Nexus(config)# username admin sshkey ssh-rsa AAAAB3NzaC1yc2EAAAAD (省略) b4whh91xnL kyamisama@kyamisamanoMacBook-puro.local
Nexus(config)#

以上で作業完了である。
下記SSHコマンドの通りオプション-iを付け、その後ろに秘密鍵を指定すれば
問題なくログインできるはずだ。

ssh -i /Users/localhost/.ssh/id_rsa admin@192.168.2.100

tornadoでHTTPSのウェブページを作ってみた。

かなり久しぶりの更新です。。
サボり気味だったので一応生存確認と言う事で今回もtornadoの記事です。
せっかくtornadoを使ってWebページを公開するところまでやったので
最低限のHTTPSの実装もやってみました。

以下その時の覚書です。

事前準備

オレオレ証明書の作成

HTTPSの実装で必要不可欠である証明書の類のものを準備します。
準備はとっても簡単、下記コマンドを打つだけでOK。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

tornadoスクリプトHTTPS仕様にする

tornadoの公式に落ちているコードをHTTPS仕様にしてみました。
※一部抜粋

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        <b>"certfile":"server.crt"</b>,
        <b>"keyfile":"server.key"</b>,
    })
    http_server.listen(<b>8443</b>)

import tornado.httpserver
import tornado.ioloop
import tornado.web
全体のコード
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("../static/test.html")

make_app=tornado.web.Application([
        (r"/", MainHandler),])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        "certfile":"server.crt",
        "keyfile":"server.key",
    })

    http_server.listen(8443)
tornado.ioloop.IOLoop.current().start()

以上でtornadoでのHTTPS実装でした。

SSHの公開鍵認証の設定手順

個人的にLinuxサーバを利用する機会があり
その時に公開鍵の設定を行ったので手順を残す。

各種環境

クライアントPC:Mac book air
サーバ:Conoha VPS Ubuntu 14.04.5

クライアント側で鍵の生成

クライアントPCで秘密鍵と公開鍵の生成を行います。
鍵生成コマンドを2種類ありますが今回はRSAで生成を行います。

$ ssh-keygen -t rsa

実行すると対話式で鍵の保存場所やパスフレーズを聞かれますので
任意の設定を行う。

問題なく鍵が生成されたか確認を行う。

$ cd ~/.ssh/
$ ls id*
id_rsa		id_rsa.pub

上記のように「id_rsa」と「id_rsa.pub」が生成されていればOK
ちなみに「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵である。
くれぐれも秘密鍵が外部に漏れないように注意してほしい。

サーバに公開鍵を登録する。

先ほど生成した公開鍵をサーバに登録するので
scpコマンドでサーバに公開鍵を転送させる。

scp -r ~/.ssh/id_rsa.pub root@<サーバのIPアドレス>:/root/

とりあえずサーバの/root/直下に転送。
そこからサーバの「authorized_keys」に公開鍵を登録する。

# ls /root/
id_rsa.pub
# cat id_rsa.pub >> ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# logout
$ ssh -i ~/.ssh/id_rsa root@<サーバのIPアドレス>

lsコマンドで/root/に公開鍵が転送されているのを確認し、
authorized_keysに登録する。
その後、パーミッションの変更を行い一度サーバからログアウトする
再度sshコマンドでログインを試みる。

Python3 Jupyter Notebook導入メモ

前回TensorFlowのセットアップ記事を書いたので
今回はTensorFlowで試行錯誤する際に便利な
Jupyter Notebookを導入してみようと思います。

下記コマンドでインストール行う。

$ pip install jupyter

そして起動。

$ jupyter notebook

うまく動作すればブラウザが起動して、Jupyter Notebookが
表示されるはずです。
f:id:kyamisama:20180923114022p:plain

今後使い方についても書いていこうと思います。