10

ゴール

R を使用して、Web ブラウザーに表示される Google 検索 Web ページの HTML をダウンロードしたいと考えています。

問題

Web ブラウザーからまったく同じ URL を使用して、R で Google 検索 Web ページ HTML をダウンロードすると、R でダウンロードした HTML が Web ブラウザー HTML と異なることに気付きました。たとえば、高度な Google 検索 URL では、日付パラメーターが無視されますHTML は R によって読み取られますが、Web ブラウザーでは保持されます。

Web ブラウザで「West End Theatre」を Google 検索し、2012 年 1 月 1 日から 1 月 31 日までの日付範囲を指定します。次に、生成された URL をコピーして R に貼り付けます。

# Google Search URL from Firefox web browser
url <- "http://www.google.co.uk/search?q=west+end+theatre&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-GB:official&client=firefox-a#q=west+end+theatre&hl=en&client=firefox-a&hs=z7I&rls=org.mozilla:en-GB%3Aofficial&prmd=imvns&sa=X&ei=rJE7T8fwM82WhQe_6eD2CQ&ved=0CGoQpwUoBw&source=lnt&tbs=cdr:1%2Ccd_min%3A1%2F1%2F2012%2Ccd_max%3A31%2F1%2F2012&tbm=&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=6f92152f78004c6d&biw=1600&bih=810"
u <- URLdecode(url)

# Webpage as seen in browser
browseURL(u)

# Webpage as seen from R
HTML <- paste(readLines(u), collapse = "\n")
cat(HTML, file = "output01.html")
shell.exec("output01.html")

# Webpage as seen from R through RCurl
library(RCurl)
cookie = 'cookiefile.txt'
curl = getCurlHandle(cookiefile = cookie,
                     useragent =  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en - US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
                     header = FALSE,
                     verbose = TRUE,
                     netrc = TRUE,
                     maxredirs = as.integer(20),
                     followlocation = TRUE,
                     ssl.verifypeer = TRUE,
                     cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))
HTML2 <- getURL(u, curl = curl)
cat(HTML2, file = "output02.html")
shell.exec("output02.html")

上記の自己完結型のコードを実行すると、開く最初の Web ページは (日付パラメーターが強制された状態で) 必要なものであることがわかりますが、2 番目と 3 番目の Web ページ (R を介してダウンロードされたもの) は日付パラメーターが無視されます。

質問

2 番目または 3 番目の Web ページではなく、最初に開く Web ページの HTML をダウンロードするにはどうすればよいですか?

システムインフォメーション

> sessionInfo()
R version 2.14.0 (2011-10-31)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RCurl_1.6-10.1 bitops_1.0-4.1

loaded via a namespace (and not attached):
[1] tools_2.14.0
4

2 に答える 2

2

Googleの検索ページの結果をデコードする代わりに、カスタム検索APIを使用できます。APIキーを取得すると、URLを介して検索条件を指定し、HTMLをデコードする代わりにJSONファイルを受け取ることができます。このrjsonパッケージは、JSONファイルをRオブジェクトに読み込み、関連データを抽出するのに役立ちます。

1日あたりのクエリ数は1000に制限されますが、操作がはるかに簡単になる場合があります。

編集:特に、カスタム検索APIは非推奨になりました。

于 2012-02-16T21:45:15.877 に答える
2

問題の一部は、Google があなたのプロファイルを作成し、以前の検索、Gmail でのディスカッション、Google マップの使用、IP アドレス、位置データ、表示された広告、ソーシャル コンタクト、その他のサービスから知っている情報に基づいて一致を返していることです。これは、Google アカウントを持っていなくても発生することがあります。

ログイン時のパーソナライズ: ウェブ履歴を使用して Google アカウントにログインしている場合、Google は、ユーザーが検索した内容や過去にアクセスしたサイトに基づいて、検索エクスペリエンスをパーソナライズします。

サインアウト 時のパーソナライズ: ログインしていない場合、Google は Cookie を使用して、ブラウザにリンクされた過去の検索情報に基づいて検索エクスペリエンスをカスタマイズします。Google では、ブラウザの Cookie にリンクされたログアウト中の検索アクティビティを最大 180 日間保存します。これには、クエリやクリックした結果が含まれます。

自動化された結果を手動の結果と一致させる唯一の方法は、プロファイルを一致させようとすることです。少なくとも、ブラウザと同じ User-Agent 文字列と同じ Cookie を送信してみてください。ネットワーク上の HTTP リクエストをスニッフィングするか、ライブ HTTP ヘッダーなどのブラウザー アドオンを使用することで、これらが何であるかを確認できます。

日付がフィルタリングされている理由については、jbaums コメントがそれをカバーしていると思います。フィルタリングと入力中の結果を処理するクライアント側でいくつかの処理が行われています。ただし、AJAX が追加される前に Google の古いインターフェイスをトリガーできる場合は、これを回避する方法があるかもしれません。Javascript を無効にすると、ブラウザで Google から得られるものを確認できます。

于 2012-03-01T01:36:20.593 に答える