R显示相同Google搜索网址的不同HTML(与网络浏览器相比)

时间:2012-02-15 11:45:32

标签: html r rcurl

目标

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

问题

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

示例

我在网络浏览器中为“West End Theatre”进行Google搜索,并指定日期范围为2012年1月1日至1月31日。然后我复制生成的网址并将其粘贴到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

2 个答案:

答案 0 :(得分:2)

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

您每天只能处理1000次查询,但使用起来可能会更容易。

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

答案 1 :(得分:2)

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

  

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

     

签名个性化:       当您未登录时,Google会根据链接到您浏览器的过去搜索信息自定义您的搜索体验,   使用cookie。 Google可以存储长达180天的退出搜索   链接到浏览器cookie的活动,包括查询和   结果你点击。

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

至于为何过滤日期,我认为jbaums评论涵盖了这一点。在客户端有一些东西可以处理过滤和结果。如果你可以在添加AJAX之前触发googles旧界面,可能有办法解决这个问题。如果禁用Javascript,请查看您在浏览器中从Google获得的内容。