R показывает другой HTML (по сравнению с веб-браузером) для одного и того же URL-адреса поиска Google - PullRequest
10 голосов
/ 15 февраля 2012

Цель

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

Задача

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

Пример

Я выполняю поиск Google в своем веб-браузере для «Театра Уэст-Энда» и указываю диапазон дат с 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

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Часть вашей проблемы заключается в том, что Google профилировал вас и возвращает совпадения на основе того, что он знает из ваших предыдущих поисков, обсуждений в gmail, использования карт Google, IP-адреса, данных о местоположении, просмотренных объявлений, социальных сетей.контакты и другие услуги.Иногда это происходит, даже если у вас нет учетной записи Google.

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

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

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

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

2 голосов
/ 17 февраля 2012

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

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

РЕДАКТИРОВАТЬ: Примечательно, что API пользовательского поиска устарела .

...