【发布时间】:2023-08-14 04:29:01
【问题描述】:
目标
我想使用 R 下载 Google 搜索网页的 HTML,如网络浏览器中所示。
问题
当我使用来自网络浏览器的完全相同的 URL 在 R 中下载 Google 搜索网页 HTML 时,我注意到 R 下载的 HTML 与网络浏览器 HTML 不同,例如对于高级 Google 搜索 URL,日期参数在 R 读取的 HTML 中被忽略,而在 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
【问题讨论】:
-
在发出请求之前是否需要 URLDecode?span>
-
@MattBridges 不幸的是,是的。例如,当输入 R 时,根据上面的代码生成不同的网页:browseURL(url);浏览网址(u)
-
我相信谷歌使用 AJAX 重新加载结果并启用这些过滤选项。
readLines和getURL在任何 AJAX 调用结果之前获取页面。 -
@jbaums 非常有趣的信息,我不知道。有没有办法让 R 也获得页面后 AJAX 调用?
-
请注意,浏览器和手动拉取之间存在许多差异——最明显的是用户代理字符串、cookie 和 javascript 感知。谷歌可以对其中任何一个采取行动。很遗憾,我们无法测试您的代码,因为 URL 在这里不起作用。在 AJAX 中,它与常规请求没有什么不同,因此它不是问题(您可以使用浏览器的跟踪功能来查看您从何处获取内容)。