【问题标题】:R shows different HTML (when compared to web browser) for the same Google Search URLR 为相同的 Google 搜索 URL 显示不同的 HTML(与网络浏览器相比)
【发布时间】: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 重新加载结果并启用这些过滤选项。 readLinesgetURL 在任何 AJAX 调用结果之前获取页面。
  • @jbaums 非常有趣的信息,我不知道。有没有办法让 R 也获得页面后 AJAX 调用?
  • 请注意,浏览器和手动拉取之间存在许多差异——最明显的是用户代理字符串、cookie 和 javascript 感知。谷歌可以对其中任何一个采取行动。很遗憾,我们无法测试您的代码,因为 URL 在这里不起作用。在 AJAX 中,它与常规请求没有什么不同,因此它不是问题(您可以使用浏览器的跟踪功能来查看您从何处获取内容)。

标签: html r rcurl


【解决方案1】:

您可以使用Custom Search API,而不是尝试解码 Google 搜索页面的结果。获得 API 密钥后,您将能够通过 URL 指定搜索条件,并接收 JSON 文件,而不必解码 HTML。 rjson 包将帮助您将 JSON 文件读入 R 对象,并提取相关数据。

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

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

【讨论】:

  • 这在理论上是一个很好的建议,我之前已经研究过。但是,我对 Google 自定义搜索 API 的主要问题是它与从 google.com 返回的结果不一致,这有点烦人。引用 Google “您的结果不太可能与 Google 网页搜索返回的结果相匹配” - 参考:google.com/support/customsearch/bin/…
  • 这个链接好像是专门讨论搜索特定页面的,尝试使用已弃用的Web Search API 搜索整个网络。
  • 使用该 API 是一个有趣的想法,但考虑到它的贬值状态,我会犹豫是否要花时间在它上面。这里需要一个更强大的长定时器解决方案(虽然我在这个问题上完全碰壁了,因为我发现很难理解 omegahat.com 上看起来很有希望的 R spidermonkey 和 RFirefox 包)。
  • @martinbel:编辑不当,已回滚。它适合作为评论,或者您可以发布使用更好方法的新答案。
  • @AndrewMedico 我刚刚自己进行了编辑。虽然我很欣赏对不当编辑的警惕。
【解决方案2】:

您的部分问题是 Google has profiled you 并根据它从您之前的搜索、gmail 讨论、谷歌地图使用、IP 地址、位置数据、查看的广告、社交联系人和其他服务中知道的内容返回匹配项。即使您没有 Google 帐户,也会发生这种情况。

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

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

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

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

【讨论】:

    最近更新 更多