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

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

ただいまの
回答率

90.51%

  • PHP

    20337questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Ruby

    7662questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Naverまとめの全ページをスクレイピングにはどう辿るのが効率的でしょうか。

解決済

回答 2

投稿

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

cutter

score 78

ネイバーの全ページのタイトル、リンクを収集したいのですが、
https://matome.naver.jp/sitemap.xml こちらのサイトマップには全件無さそうで、URLにある個別のIDは前記事連番では無いので、カウントダウンしながら等は難しいのかなと思いました。

リンクをクローラで回してたどる場合は重複ページを開くことが非常に多くなるため、効率的ではないかと思うのですが、ロジックが思いつかないのですが、どのようにすれば効率よく、存在するページを辿っていけるでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+5

利用規約ぐらい読みましょうよ。

抜粋
第4条(コンテンツの取扱い)
本サービスが当然に予定している利用態様を超えて利用(複製、送信、転載、改変などの行為を含みます。)してはなりません。

ただし、コンテンツを入手したいのであれば、コンテンツ提供をビジネスとして想定した規約になっているので、運営会社へコンタクトすることで、入手できると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/01 20:26

    統計分析に使うようなイメージでも引っかかるのでしょうかね。
    複製ではなくビッグデータ分析なら良いかと思いました。

    キャンセル

  • 2017/02/01 20:32

    「本サービスが当然に予定している利用態様」じゃないからスクレイピングではダメでしょ。

    但し書きしたように、コンテンツ提供をビジネスとして想定しているので、運営会社へコンタクトするのがコンテンツを利用したい人のあるべき姿です。

    キャンセル

checkベストアンサー

0

#encoding : utf-8
require"open-uri"
require"certified"

url = "https://matome.naver.jp/girls"

puts "作業開始"

loop{
  sleep(4)
  page = open(url, &:read)
  title = page.scan(%r|<a href="(.+?)" title="(.+?)"  >|).reject{|e| e[0].include?("odai") == false}

  File.open("URL集.txt", "a") do |f|
    title.each do |element|
      f.puts("#{element[1]}" + "\t" + "https://matome.naver.jp#{element[0]}")
    end
  end

  next_page = page.scan(%r|<strong>(.+?)</strong>|).flatten[0].to_i + 1
  list = page.scan(%r|<a href="#" onclick="(.+?)"  >(\d+?)</a>|).map{|e| e[1].to_i}
  if list.include?(next_page)
    url = "https://matome.naver.jp/girls" + "?page=" + next_page.to_s
    puts "次は#{next_page}ページ目です。"
  else
    break
  end
}


考えてみました。収集した記事のタイトルとURLは「URL集」に保存されます。

補足

Neverまとめを理解していませんでした。よく見てみると
開いたときに出てくる記事が全てではないということが分かりました。

変更

#encoding : utf-8
require"open-uri"
require"certified"

base = "https://matome.naver.jp/topic/1Lv56"

url = base

puts "作業開始"

loop{
  sleep(4)
  page = open(url, &:read)
  title = page.scan(%r|<a href="(.+?)" >(.+?)</a></h3>|)

  File.open("URL集.txt", "a") do |f|
    title.each do |element|
      f.puts("#{element[1]}" + "\t" + "#{element[0]}")
    end
  end

  next_page = page.scan(%r|<strong>(.+?)</strong>|).flatten[0].to_i + 1
  list = page.scan(%r|<a href="#" onclick="(.+?)"  >(\d+?)</a>|).map{|e| e[1].to_i}
  if list.include?(next_page)
    url = base + "?page=" + next_page.to_s
    puts "次は#{next_page}ページ目です。"
  else
    break
  end
}


各トピックのURLをとることができれば、eachで配列から一つずつbaseに入れて
動かせます。どうやって各トピックのURLを集めるのかという問題がありますが。
記事被りについては、別で対応した方が楽だろうと私個人は思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/01 22:26

    ありがとうございます。
    やはりそうやってカテゴリやタグやトピックなどの一覧をどうにか収集、からのページめくり、でもトピック被りしていたりすると膨大なデータから重複チェック、という事が必要になりそうなのですね。。

    キャンセル

  • 2017/02/01 22:29 編集

    一旦記事を全て収集してから作ったテキストファイルに手を加えるということを考えています。
    記事を収集しながら重複チェックをすると大変そうなので。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    20337questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Ruby

    7662questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。