http://www.related-keywords.com/


上記のサイトをスクレイピングして、データを取得を試みています。
authcode=hogehogeの部分なのかpostだからか
Nokogiriやselenium webdriverなど使ってもうまく取得できませんでした。
このようなフォームの場合取得するにはどうすればいいでしょうか。
もし簡単にrubyなどでソースかいていただければ助かります・・・・・・m(_ _)m

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/04/29 06:06:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント500pt

Cookie に PHPSESSID が入っているので、セッションを継続できるタイプのライブラリを使うのが楽です(自前でもできなくはないですが)。
というわけで、Mechanize を使います。

ひとつ、トラップがあります。
そのページのソースの script タグをよく見てください(整形してます)。

<script type="text/javascript">
    ...     // Google Analytics のコード
    $(function() {
        $("#gaco").val("DBSNl");        // ★ここ
    });
</script>

id=gaco は、name=authcode の input type=hidden の要素です。
id=gaco に設定している値は、毎回変わります。

というわけで、こんな感じのコードで取得できます。

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.related-keywords.com/')

s = page.search('script')

if /\$\(".gaco"\).val\("(.*)"\)/ =~ s[1].inner_html then
    f = page.form()
    f.field_with(:name => "authcode").value = $1
    f.field_with(:name => "keyword").value = ''       # キーワード
    res = agent.submit f
    # ここからは、検索結果のスクレイピング
    res.search("a").each { |link|
        puts link.inner_html + " : " + link.attribute("href")
    }
end

スクリプトは UTF-8 で書いてください。


微妙なトラップを入れてるのは、「ガシガシとリクエストを飛ばしてくれるな」ということだと思いますので、その辺は察してアクセスしてください。

id:yes_ouzi_no

こちら、ありがとうございます。!トラップ全く読めずでした・・・
勉強になります。

2016/04/29 06:06:16
id:a-kuma3

id が gaco (google analytics code ?) だし、name が authcode なので、機械的なアクセスを意図的にガードしている、というよりは、Google の何かの API の使う際のトークンか何かを設定しているのかなあ、という気もするんですが、ググってみても情報が見つけられないんですよね。

意図的なガードだったら、置き換える元と後の文字列の長さを同じにした方が、絶対に分かりにくいし。

トラッキングコードの書き方も、チョイ古いみたいだし、ややモヤっとした感じは残るのですが :-)

2016/04/29 09:37:10

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません