10

目标

我想使用 R 下载谷歌搜索网页的 HTML,如网络浏览器中所示。

问题

当我在 R 中使用与 Web 浏览器完全相同的 URL 下载 Google 搜索网页 HTML 时,我注意到 R 下载的 HTML 与 Web 浏览器 HTML 不同,例如,对于高级 Google 搜索 URL,日期参数在HTML 由 R 读取,而在 Web 浏览器中则保留。

例子

我在我的网络浏览器中使用 Google 搜索“West End Theatre”,并指定日期范围为 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")

通过运行上面的自包含代码,我可以看到打开的第一个网页是我想要的(强制执行日期参数),但打开的第二个和第三个网页(通过 R 下载)忽略了日期参数。

问题

如何下载打开的第一个网页而不是第二个/第三个网页的 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 指定搜索条件,并接收 JSON 文件,而不必解码 HTML。该rjson包将帮助您将 JSON 文件读入 R 对象,并提取相关数据。

您将被限制为每天 1000 个查询,但使用起来可能会容易得多。

编辑:值得注意的是,自定义搜索 API 已被弃用

于 2012-02-16T21:45:15.877 回答
2

您的部分问题是,Google 已经对您进行了分析,并根据您之前的搜索、Gmail 讨论、谷歌地图使用、IP 地址、位置数据、查看的广告、社交联系人和其他服务所知道的信息返回匹配项。即使您没有 Google 帐户,也会发生这种情况。

登录个性化: 当您使用网络历史记录登录 Google 帐户时,Google 会根据您搜索过的内容以及您过去访问过的网站来个性化您的搜索体验。

退出个性化: 当您未登录时,Google 会根据与您的浏览器相关联的过去搜索信息,使用 cookie 来定制您的搜索体验。Google 会存储与您浏览器的 cookie 相关联的最多 180 天的退出搜索活动,包括您点击的查询和结果。

使您的自动结果与您的手动结果匹配的唯一方法是尝试匹配您的个人资料。至少您应该尝试发送与浏览器相同的 User-Agent 字符串和相同的 cookie。您可以通过嗅探网络上的 HTTP 请求或使用诸如 Live HTTP Headers 之类的浏览器插件来找出这些是什么。

至于为什么要过滤日期,我认为 jbaums 的评论涵盖了这一点。客户端上有一些东西在处理过滤和输入时的结果。如果您可以在添加 AJAX 内容之前触发 google 的旧界面,则可能有一种解决方法。如果您禁用 Javascript,请在​​浏览器中查看您从 Google 获得的信息。

于 2012-03-01T01:36:20.593 回答