Seleniumを使ったスクレイピング
えー以前からUdemyと呼ばれるオンライン学習プログラムで勉強する為に色々と教材を買っていましたが、買ってそのままというのが常態化してきたので最近消化し始めました今日この頃です。
なので今回はUdemyで学習したことを書こうと思います!
Seleniumを使ってスクレイピングします!
と言うことで、タイトル通りスクレイピングします。
しかも今回はJupyter Notebookを使ってみました!
以前にJupyter Notebookをインストールしてそのまま放置してたやつですね。。。
ではでは早速Jupyter Notebookを起動してみます。
Jupyter Notebookの起動
以下のコマンドで起動してみる。
$ jupyter notebook
するとブラウザが立ち上がり以下の様な画面が表示される。
これで起動は完了。
Jupyter Notebookのワークディレクトリの作成
デフォルトで”Untitled Folder”ってフォルダ名がありますが、今回は別途作業フォルダを作成します。
作成方法はとても簡単で下記図の通り、左端の”NEW”と言うタブから”Folder”をクリックする事で新規でフォルダを作成できます。
作成するとこんな感じ↓
”Untitled Folder 1”ってのが新しくできると思います。
フォルダの名前を変更したければ、ゴミ箱マークの横に”Rename”ってあるのでそこから変更できます。
Seleniumを使ったスクレイピング
作業フォルダも出来たので次に実際にPythonのコマンドを書いていく作業ファイルを準備します。
作業フォルダを作成した方法と同様に”New”→”Python [Root]”をクリックします。
すると新しくブラウザタブが追加されます。基本的にはこの新しく追加されたページで作業を行います。
今回は練習みたいなものなので比較的スクレイピングがやり易いページから情報を取得したいと思います。
よくあるランキングサイトからのスクレイピングをやってみたいと思います。
ランキングサイトからの情報を取得する
今回はスクレイピングさせて頂く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
そして、商品名の取得。
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
最後に投票数の取得。
points = browser.find_elements_by_class_name('article-meta') all_point = [] for _point in points: point = _point.text all_point.append(point) all_point
これで3つの情報を取得できました。
ただ取得した情報がバラバラだと味気ないのでこの情報を合体させたいと思います。
最後に取得した情報をCSVに纏めて保存
それぞれ取得した情報をPandasを使って綺麗に整理して保存してみます。
import pandas as pd df = pd.DataFrame() df['ランキング'] = all_rank df['商品名'] = all_name df['投票数'] = all_point df
以上で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の実装もやってみました。
以下その時の覚書です。
事前準備
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で秘密鍵と公開鍵の生成を行います。
鍵生成コマンドを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が
表示されるはずです。
今後使い方についても書いていこうと思います。