勉強した項目: git, Github, scraping
時間: 10:00
内容:
*学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです*
###[Git]
Gitはソースコードの変更履歴、バージョン等を記録するツール
最大の特徴は、分散型の名の通り、ローカル環境に、全ての変更履歴を含む完全なリポジトリの複製が作成されるということである。
(リポジトリ:複数のデータや情報などが体系立てて保管されているデータベース)
###[Github]
Gitの仕組みを利用して、世界中の人々が自分のプログラムコードやデザインデータなどを保存、公開することができるようにしたウェブサービスの名称である。
エンジニアの履歴書のような役割
###[git clone]
外部のサーバーにあるGitで管理されたソースコードを自分のパソコン(ローカル環境)にダウンロードするコマンド
git clone リポジトリURL ディレクトリ名
という形でターミナルで実行する
###[lsコマンド]
lsコマンドはlinux
コマンドの一つ
lsコマンドを使用すると、現在のディレクトリにあるファイルを表示することができる、lsは「list segments」
の略
###[bundlerによるgem管理]
bundlerを利用してインストールしたgemは、Railsの各プロジェクトではなく、Rubyのバージョンごとにある保存場所にインストールされる
bundle show [gemの名前]
というコマンドを実行でどこに保存されているのか確認することができる
###[bundle execコマンド]
bundle exec は2つ以上のrailsアプリケーションを同じバージョンのRubyを利用して作成している際に必要となるコマンド
→同じRubyのバージョンで複数のアプリケーションを開発していると、同じ名前のgemでもアプリケーションごとにバージョンが異なることがあるため
###[スクレイピング]
ウェブサイト上のHTMLからある特定のデータを抜き出す処理のこと
→
- の中にある値を取り出すこと
###[Mechanize]
スクレイピングを行うためのGem
Mechanizeクラスが使えるようになり、スクレイピングをするための様々なメソッドが存在するGemfileの最後の行に
Gemfilegem 'mechanize'
記載する。
Gemfileに記述されたGemをインストールするにはターミナルでコマンドbundle install
を打ち込むことを忘れないようにする。###[getメソッド]
Mechanizeクラスのインスタンスメソッド
get("スクレイピングしたいウェブサイトのURL")と引数にURLの文字列を指定することで、そのURLのウェブサイトのHTMLを取得できるagent = Mechanize.new page = agent.get("http://naru-taka-kokua.com") # naru-taka-kokua.comのHTMLを取得
pageは単なるHTMLの文字列ではなくそのウェブサイトのHTMLの情報を持った
Mechanize::Pageオブジェクト
である###[searchメソッド]
getメソッドで取得したページの情報が入ったオブジェクトに対して使用
→取得したウェブサイトのHTML情報の中から指定したHTML要素の内容を検索できるelements = Mechanize::Pageオブジェクト.search('セレクタ')
引数のセレクタとはCSSのようにHTMLのタグの要素名を指定し、
'h1'や'li a'
のような指定
クラス名でも.hoge
のように指定することができるagent = Mechanize.new page = agent.get("http://naru-taka-kokua.com/") elements = page.search('h2') # h2要素を検索 puts elements
###[inner_textメソッド]
searchメソッド
で得られたHTML情報のテキストを取得したい場合、inner_textメソッド
を使うagent = Mechanize.new page = agent.get("http://naru-taka-kokua.com/") elements = page.search('h2 a') # h2要素の下のa要素を検索 puts elements
###[get_attributeメソッド]
aタグ要素
のHTMLはリンク先のURLを値とする属性href
を持っているので、このHTMLの属性の値を取得したい場合、get_attribute
メソッドを使うagent = Mechanize.new page = agent.get("http://naru-taka-kokua.com/") elements = page.search('h2 a') # h2要素の下のa要素を検索 elements.each do |ele| puts ele.get_attribute('href') # puts ele[:href]としても良い end
###[スクレイピングの手順 簡潔に]
1/Mechanizeクラスのインスタンスを生成
2/Mechanizeクラスのインスタンスメソッドget(情報を取得したいウェブサイトのURL)で、ウェブサイトのHTML情報を取得
3/欲しいデータのあるタグ要素をsearchメソッドで指定して取得
4/取得したタグ要素のHTML情報にたいしてinner_textメソッド、またはget_attributeメソッドを使って欲しい値を取得実際のHTMLを確認には、
[command] + [option] + [u]
を押してソースコードを表示できるelement = page.search('.etc div)
のetc
がクラス名###[atメソッド]
searchメソッドと同じようにセレクタを指定して、該当するHTML要素を取得するメソッド
→searchメソッドのように該当するものが複数あってもすべて取得はせず、最初の1つしか取得しないele.get_attribute('src')
は、ele[:src]
と書くことも可能###[reload!]
コンソール起動中にコードを修正・追記した際、コンソールはリアルタイムで変更内容を反映してくれないので再起動する必要がある
→これをreload! コマンドを実行すると毎回exitの再起動しなくてもコンソールがコードの変更内容を読み込んでくれる###[first_or_initializeメソッド]
whereメソッド
とともに使うことで、where
で検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作るメソッド###[rails generate migrationコマンド]
テーブルにカラムを追加したり、削除するようなテーブルの構造を変えたいときもマイグレーションファイルを作成するターミナル$ bundle exec rails g migration AddRateToApps # => マイグレーションファイルの作成
これだと、Appsのマイグレーションファイルが作られる
###[add_column]
add_column
をマイグレーションファイルのchangeメソッド
内に書くとカラムの追加ができるadd_column :テーブル名, :カラム名, :カラムの型
複数のカラムを追加する場合は段落分けて記述する
add_column :テーブル名, :カラム名, :カラムの型 add_column :テーブル名, :カラム名, :カラムの型 add_column :テーブル名, :カラム名, :カラムの型
###[remove_column]
changeメソッドではカラムを追加だけでなく削除もできるremove_column :テーブル名, :カラム名, :カラムの型
必ず、マイグレーションファイルを変更した場合は、ターミナルにて
rake db migarate
を実行する###[while文を抜け出すのは途中にbrakeを記載する]
###[orderメソッド]
データベースからデータ取得時にデータをどう並び替えるかというのが指定できるモデル名.order('カラム名 順序')
実行例 詳細 App.order('id DESC') idを降順でAppデータ取得 App.order('id ASC') idを昇順でAppデータ取得 ###[limitメソッド]
データをいくつ取得するかというのが指定できるメソッドデータをいくつ取得するかというのが指定できるメソッド
App.limit(20) #Appを20件まで取得する
orderメソッド
を使うことによって最新順にデータを取り出すこともできる@app = App.order('id ASC').limit(20)
appテーブルをidで昇順に並べ替え、20件だけを取得し、それらを@appという変数に代入している
###[findメソッド]
findメソッドは引数に指定したidにあたる作品情報を1件だけ取得
→もし、そのidにあたる作品が存在しない場合、エラーが発生例:idが10のappを取得する
App.find(10) # idが10のAppモデルのインスタンスが取得 # or # idが10のAppモデルのインスタンスがない場合エラー
###[rake routesコマンド]
アプリケーションでアクセスできるHTTPリクエストの一覧を見ることのできるコマンド
→HTTPリクエストのメソッド(GET, POSTなど)とパス、それに対応するコントローラとアクション名が確認できる表示されるコマンド例
ターミナルapp GET /apps/:id(.:format) apps#show
GETで/app/:id(:format)というHTTPリクエストが呼ばれた時にappsコントローラーのshowメソッドが呼ばれる
###[params[:id]]
HTTPリクエストが送られると、パス(/products/20)から作品idを取得することができる作品idはパラメーターとして自動的にparamsというハッシュ型の変数に格納されコントローラに送られ、キーは/products/:idのid、バリューはアクセスしたパスの:idの箇所に一致する数字となる
###[LIKE句]
あいまい
な文字列の検索をすることができるもので、whereメソッド
と一緒に使う使い方→
モデルクラス名.where('検索するカラム名 LIKE(?)', "検索するキーワード")
曖昧な文字列について
文字列 意味 % 任意の文字列(空白文字列含む) _ 任意の1文字 % と _ の位置に注意して
実行例 詳細 where('title LIKE(?)', "a%") aから始まるタイトル where('title LIKE(?)', "%b") bで終わるタイトル where('title LIKE(?)', "%c%") cが含まれるタイトル where('title LIKE(?)', "d_") dで始まる2文字のタイトル where('title LIKE(?)', "_e") eで終わる2文字のタイトル ###[resourcesメソッド]
対象となるリソース名(コントローラ名)を指定するだけで、Railsのリソースの7つのアクションで記載した7つのアクション名に対してのルーティングが自動的に設定できるconfig/routes.rbRails.application.routes.draw do resources :app:
ターミナルにて bundle exec rake routes コマンドを実行すると7つのルーティングが確認できる
Prefix Verb URI Pattern Controller#Action apps GET /apps(.:format) apps#index POST /apps(.:format) apps#create new_app GET /apps/new(.:format) apps#new edit_app GET /apps/:id/edit(.:format) apps#edit app GET /apps/:id(.:format) apps#show PATCH /apps/:id(.:format) apps#update PUT /apps/:id(.:format) apps#update DELETE /apps/:id(.:format) apps#destroy
###[resourcesメソッドのネスト]
config/routes.rbresources :apps do resources :reviews end
###[form_for]
form_for
は、特定のモデルを編集・追加するためのフォームを生成するヘルパーメソッド
→特定のテーブルにレコードだけを新規作成、更新するときに利用する<%= form_for(モデルクラスのインスタンス) do |f| %> … <% end %>
form_for
内で使うメソッドは、f.htmlタグ名 :カラム名
の形で指定メソッド 用途 f.label labelのlabelタグを表示 f.text_field textのinputタグを表示 f.date_select モデルで設定したフィールドをselectタグで選べるようにして表示 f.check_box checkboxのinputタグを表示 f.number_field numberのinputタグを表示 f.submit submitのinputタグを表示 一部です。
###[form_forとform_tag]
form_for
とform_tag
どちらを使うべきかは、基本的にモデルの有無で判断するform_for→入力フォームで入力するデータのモデルがある (投稿フォームなど)
form_tag→入力するデータが特にモデルを持っていない (検索フォームなど)