2012-02-15 2 views
10

ЦельR показывает различные HTML (по сравнению с веб-браузер) для той же Google Search URL

Я хотел бы использовать R, чтобы загрузить HTML поисковой странице Google, как показано в веб-браузере.

Проблема

Когда я загружаю Google Поиск веб-страниц HTML в R, используя тот же URL с помощью веб-браузера, я заметил, что R скачано HTML отличается от веб-браузера HTML, например для продвинутого URL-адреса Google, параметр даты игнорируется в HTML, читаемом R, тогда как в веб-браузере он сохраняется.

Пример

Я делаю поиск Google в веб-браузере для «West End театр» и указать диапазон дат 1 января по 31 января 2012 года я затем скопировать сгенерированный 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 
+0

Является ли URLDecode перед тем, как сделать запрос необходимым? –

+0

@MattBridges К сожалению, да. Например, следующие производят различные веб-страницы, основанные на коде выше, при вводе в R: browseURL (url); browseURL (u) –

+1

Я считаю, Google использует AJAX для перезагрузки результатов с включенными параметрами фильтрации. 'readLines' и' getURL' получают страницу до результатов любых вызовов AJAX. – jbaums

ответ

2

Вместо того, чтобы пытаться расшифровать результаты поиска страниц Google, вы можете просто использовать Custom Search API. После получения ключа API вы сможете указать критерии поиска по URL-адресу и получить файл JSON вместо того, чтобы декодировать HTML. Пакет rjson поможет вам прочитать файл JSON в R-объект и извлечь нужные данные.

Вы будете ограничены 1000 запросами в день, но с ними было бы намного легче работать.

EDIT: Примечательно, что Пользовательский API поиска устарел.

+0

Это теоретически хороший sugestion и то, что я изучил прежде всего. Однако основная проблема, с которой я сталкиваюсь с API пользовательского поиска Google, заключается в том, что она не согласуется с результатами, полученными, скажем, из Google.com, что несколько раздражает. Цитируя Google, «ваши результаты вряд ли совпадут с результатами, полученными в результате поиска в Google Web». Ссылка: http://www.google.com/support/customsearch/bin/answer.py?hl=ru&answer=141877 –

+0

Это звучит так ссылка конкретно касается поиска определенных страниц, попробуйте устаревший [API веб-поиска] (https://developers.google.com/web-search/) для поиска по всей сети. – blahdiblah

+0

Это интересная идея работать с этим API, но, учитывая ее обесценившийся статус, я бы не решался инвестировать в нее время. Здесь требуется более надежное решение с длинным таймером (хотя я полностью ударил кирпичную стену на этом, если я честен, поскольку мне трудно понять пакеты R spidermonkey и RFirefox на omegahat.com, которые выглядели многообещающими). –

2

Часть вашей проблемы в том, что Google has profiled you и возвращает совпадения на основе того, что она знает из ваших предыдущих поисков, обсуждений в Gmail, использования карт Google, IP-адреса, данных местоположения, просмотренных объявлений, социальных контактов и других услуг. Некоторые из них случаются, даже если у вас нет учетной записи google.

Подписано в персонализацию: Когда вы вошли в аккаунт Google с веб-истории, Google персонализирует результаты поиска на основе того, что вы искали и какие сайты вы посещали в прошлое.

Подпись отъезда персонализация: Когда вы не вошли в систему, Google адаптирует результаты поиска на основе данных о предыдущих поисковых запросах, связанных с вашим браузером, с использованием печенья. Google хранит до 180 дней с момента входа в систему активность, связанная с файлом вашего браузера, включая запросы и результатов, которые вы нажимаете.

Единственный способ, чтобы ваши автоматизированные результаты соответствовали вашему руководству, состоит в том, чтобы попытаться подобрать свой профиль. По крайней мере, вы должны попробовать отправить ту же строку User-Agent, что и ваш браузер, и те же файлы cookie. Вы можете узнать, что это, обнюхивая ваши HTTP-запросы в сети или используя аддон браузера, такой как Live HTTP Headers.

Что касается того, почему дата отфильтровывается, я думаю, что комментарий jbaums охватывает это. На стороне клиента есть что-то, что обрабатывает фильтрацию и результаты, пока вы-тип. Возможно, есть способ обойти это, но если вы можете запустить старый интерфейс googles перед добавлением материала AJAX. Посмотрите, что вы получаете от Google в своем браузере, если отключить Javascript.