質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.21%

大学のシラバスをスクレイピング したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 734

trrn2011

score 26

現在こちらの大学のシラバスをスクレイピングしたいです
一橋大学 mercas
ログインしなければ見れないのですが一般の方は何も入力せずにログインすれば見れるようになります
その後シラバスのページに進むとシラバスが検索できるようになります

やったこと
rubyのライブラリであるmechanizeを使ってログインしようとしたのですがうまくいきません
具体的には

require 'rubygems'
require 'nokogiri'
require 'mechanize'
agent = Mechanize.new

agent.get('https://mercas.hit-u.ac.jp/Campus/Web/UniversityPortal/UserAttestation/WFU06010.aspx') do |page|
  login_result = page.form_with(:action => 'WFU06010.aspx') do |login|
    login.field_with(:name => 'txbID').value = ""
    login.field_with(:name => 'txbPassword').value = ""

  end.submit
end

agent.get('https://mercas.hit-u.ac.jp/Campus/Web/UniversityPortal/WFC00010.aspx') do |page|
  p page
end

というコードでログインしたあとサイトのページの情報表示させようとしたのですが

#<Mechanize::Page
 {url
  #<URI::HTTPS https://mercas.hit-u.ac.jp/Campus/Web/UniversityPortal/WFC00010.aspx>}
 {meta_refresh}
 {title "一橋大学 学務情報システム・学生ポータル Mercas(MERCURY CAMPUS SYSTEM)"}
 {iframes}
 {frames}
 {links
  #<Mechanize::Page::Link "利用マニュアル(教員用)" "/manual-teacher-N.pdf">
  #<Mechanize::Page::Link "利用マニュアル(学生用)" "/manual-student.pdf">
  #<Mechanize::Page::Link
   "ログアウト"
   "javascript:__doPostBack('UC00050$linkLogOut','')">
  #<Mechanize::Page::Link
   "ウインドウを閉じる"
   "javascript:__doPostBack('UC00050$linkClose','')">}
 {forms
  #<Mechanize::Form
   {name "WFC01010"}
   {method "POST"}
   {action "WFC01010.aspx"}
   {fields
    [hidden:0x3fcf3e123e80 type: hidden name: __VIEWSTATE value: /wEPDwUKLTExNjY1ODMyMA8WCB4STWVzc2FnZUluZm9ybWF0aW9uFgEy/QIAAQAAAP////8BAAAAAA~中省略~6m0yE2u2Y=]
    [hidden:0x3fcf3e123a70 type: hidden name: __VIEWSTATEGENERATOR value: 0B535023]
    [hidden:0x3fcf3e12369c type: hidden name: __EVENTVALIDATION value: /wEWAwKSoqUuAuegiskIAvrV7/IH6dgLY2bsu9wzjA4YEZUT7CSPO1Y=]}
   {radiobuttons}
   {checkboxes}
   {file_uploads}
   {buttons}>}>

となりメニューバーの部分しか表示されません

とりあえずシラバスの検索結果のテキストを取り出したいです
よろしくおねがいします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

前置き
スクレイピングは相手のサイトに迷惑をかけない範囲で行いましょう。

本題
今回スクレイピングをしようとしているサイトは動的にページが
生成されるようなのでmechanizeではできないはずです。

SeleniumでもCapybaraでも動的に変化するページを扱えますが
私は使い慣れているWatirを選びました。

以下のコードを実行するとFirefoxが立ち上がり、シラバスの
授業科目一覧が一ページずつ切り替わっていくと思います。

require 'watir'
require 'nokogiri'

# 動かすのに必要なもの
# watir       http://watir.com/
# nokogiri    https://github.com/sparklemotion/nokogiri
# Firefox     https://www.mozilla.org/ja/firefox/
# geckodriver https://github.com/mozilla/geckodriver/releases

# timeoutの設定
client = Selenium::WebDriver::Remote::Http::Default.new
client.open_timeout = 480
client.read_timeout = 480
Watir.default_timeout = 600

browser = Watir::Browser.new :firefox
browser.goto('https://mercas.hit-u.ac.jp/Campus/Web/UniversityPortal/UserAttestation/WFU06010.aspx')
browser.div(xpath: '/html/body/form/div/div/div/div[2]').wait_until(&:present?)

# Loginをクリック
browser.element(xpath: '//*[@id="btnLogin"]').click

# シラバス・ゼミをクリック
browser.element(xpath: '//*[@id="UC00050_S_0"]').click

# シラバス検索をクリック
browser.element(xpath: '//*[@id="UC00060_S_02"]').click

# 検索をクリック
browser.element(xpath: '//*[@id="searchButton"]').click

# 授業科目一覧の表示を待機
browser.span(xpath: '//*[@id="lblGamenTitle"]').wait_until(&:present?)


doc = Nokogiri::HTML.parse(browser.execute_script('return document.documentElement.innerHTML'))

last_page = doc.xpath('//*[@id="lblAllPage"]').text.to_i
current_page = doc.xpath('//*[@id="lblCurrentPage"]').text.to_i

while current_page < last_page
  sleep(3)
  browser.element(text: '次のページへ>').click
  current_page += 1
end

browser.close

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

結果にも現れていますが、該当のページ内には <iframe> があるようですね。
そちらを取得しないとスクレイピングはできませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/27 17:37

    ありがとうございます
    調べてみます

    キャンセル

  • 2018/08/27 17:43

    iframeについて調べてみたのですがページのソースにはiframeの記述が見つかりません汗
    iframeってどの部分に書かれているものなのでしょうか?

    キャンセル

  • 2018/08/27 17:49

    Mechanize::Page を表示している結果のところにすでに出てきていますよね。
    シラバスページのHTMLソースを表示して、検索してみてはいかがですか?

    キャンセル

  • 2018/08/27 17:53

    シラバスページのHTMLソースにiframeが見つかりません汗という意味です。
    伝わりづらくてすいません、、、

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる