3

Web サイトからデータをスクレイピングしようとしています。これは私が通常 Perl で行うようなことですが、Perl から離れたいと思っています。(私は Perl を否定しているわけではありません。Perl は価値のあるツールでしたが、10 年以上経った今でもこの言語に苦労していることに苦しんでいます。) 私のニーズは単純であり、パフォーマンスが私にとって問題になることはめったにないので、私はそうしたいと思っています。 Web スクレイピングを R に移行します。R はある程度知っていますが、RCurl や同様のライブラリを使用したことはありません。

タスクは、公開されているデータのデータベースをスクレイピングすることです。JS ソースを見て、RCurl postForm リクエストに何を含めるかを考えているだけなので、引数を渡す方法が正確にわからないため、問題は複雑です。以下のコードは明らかなエラーをスローしませんが、有用なものも返しません。

Q. 何が間違っていますか?

[編集済み: 提案された変更を反映するため、まだ解決されていません]

require(RCurl)
## -----------> Form:
## http://jamaserv.jama.or.jp/newdb/eng/index.html
## -----------> Result:
## http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html

#POST /newdb/eng/prod4/prod4TsMkEntry.html makerCd=5&additionBase=1&additionInterval=1&chkSelCnd3=0&car4Cd=100005&termFrom=201103&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm

#POST /newdb/eng/prod4/prod4TsMkEntry.html?pass chkSelCnd3=0&prod4TsMkEntryForm%2Feng%2Fprod4%2Fprod4TsMkEntry.html=prod4TsMkEntryForm&makerCd=5&additionBase=1&termTo=201203&prod4TsMkEntryForm%3AdoAction=Server&additionInterval=1&termFrom=201103&car4Cd=100005

x <- postForm('http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html?pass',
              chkSelCnd3 = '0',
              'prod4TsMkEntryForm/eng/prod4/prod4TsMkEntry.html' = 'prod4TsMkEntryForm',
              makerCd = '5',
              additionBase = '1',
              termTo = '201203',
              'prod4TsMkEntryForm:doAction' = 'Server',
              additionInterval = '1',
              termFrom = '201103',
              car4Cd = '100005',
              .opts = curlOptions(
              referer = 'http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html',
              verbose = TRUE,
              header = TRUE,
              followLocation = TRUE,
              useragent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'
  )
)

ブラウザを使用する場合、フォームは次のようになります。 ここに画像の説明を入力

そして、上記の設定は(別のページで)これを返します: ここに画像の説明を入力

4

2 に答える 2

4

引数を追加して.opts、リファラー (外部からのクエリを拒否する Web サイトもあります)、ユーザー エージェント (不明なユーザー エージェントを拒否する Web サイトもあります) を指定し、リダイレクトに従うように依頼できます (結果が空だったのはそのためです)。 )。追加すると、より多くの情報が得られますverbose=TRUE: フォームのコンテンツが送信される前に、最初の POST クエリが実際に失敗し、代わりに RCurl が GET クエリを試行し、エラー メッセージ (「タイプ (自動車) が選択されていません」) が返されます。

x <- postForm(
  ...,
  .opts = curlOptions(
    referer="http://jamaserv.jama.or.jp/newdb/eng/prod4/prod4TsMkEntry.html",
    verbose = TRUE, 
    followLocation = TRUE,
    useragent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
  )
)
于 2012-05-18T02:16:33.123 に答える
1

これは、サーバー側の Javascript やあらゆる種類のものを含む、最初に発生したよりもはるかに複雑な問題であることが判明しました。この質問で使用した単純なアプローチでは実現可能ではないようです。それで、私自身の質問に答えて先に進みます...

于 2012-06-17T08:30:36.290 に答える