Я смотрю на этот отличный ответ: https://stackoverflow.com/a/58211397/3502164.
В начало решения входят:
library(httr)
library(xml2)
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(content(gr, "text"))
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Вывод постоянен для нескольких запросов:
"59243d3a2....61f8f73136118f9"
Мой способ по умолчанию был бы таким:
doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
Эти результаты отличаются от результатов выше и меняются в нескольких запросах.
Вопрос:
В чем разница между:
read_html(url)read_html(content(GET(url), "text"))Почему это приводит к разным значениям и почему только решение «GET» возвращает csv в связанном вопросе?
(Я надеюсь, что можно будет структурировать его по типу трех дополнительных вопросов).
Что я пробовал:
Спускаемся в кроличью нору вызовов функций:
read_html
(ms <- methods("read_html"))
getAnywhere(ms[1])
xml2:::read_html
xml2:::read_html.default
#xml2:::read_html.response
read_xml
(ms <- methods("read_xml"))
getAnywhere(ms[1])
Но это привело к следующему вопросу: найдите используемый метод для функций оболочки R
Мысли:
Я не вижу, чтобы запрос на получение принимал какие-либо заголовки или файлы cookie, которые могли бы объяснить разные ответы.
Насколько я понимаю, оба read_htmlи read_html(content(GET(.), "text"))вернут XML / html.
Хорошо, здесь я не уверен, есть ли смысл проверять, но поскольку у меня закончились идеи: я проверил, происходит ли какое-то кеширование.
Код:
with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, 19 Nov 1981 08:52:00 GMT
<- Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
-> Мне не кажется, что кеширование может быть решением.
help("GET")есть интересный раздел, касающийся "условного GET":Семантика метода GET изменяется на «условный GET», если сообщение запроса включает поле заголовка If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match или If-Range. Условный метод GET требует, чтобы объект был передан только при обстоятельствах, описанных полями условного заголовка. Условный метод GET предназначен для уменьшения ненужного использования сети, позволяя обновлять кэшированные объекты без необходимости многократных запросов или передачи данных, уже хранящихся у клиента.
Но, насколько я понимаю, with_verbose()ни один из If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Rangeних не установлен.
Разница в том, что при повторных вызовах httr::GETдескриптор сохраняется между вызовами. С xml2::read_html(), каждый раз создается новое соединение.
Из документации httr:
Пул дескрипторов используется для автоматического повторного использования дескрипторов Curl для той же комбинации схемы / хоста / порта. Это обеспечивает автоматическое повторное использование сеанса http и сохранение файлов cookie во всех запросах к сайту без вмешательства пользователя.
Из документации xml2, обсуждая строковый параметр, который передается read_html():
Строка может быть либо путем, либо URL-адресом, либо буквальным xml. URL-адреса будут преобразованы в соединения с помощью
base::urlили, если они установлены,curl::curl
Итак, ваш ответ - read_html(GET(url))это как обновить ваш браузер, но read_html(url)как закрыть его и открыть новый. Сервер дает уникальный идентификатор сеанса на странице, которую он доставляет. Новая сессия, новый ID. Вы можете доказать это, позвонив httr::reset_handle(url):
library(httr)
library(xml2)
# GET the page (note xml2 handles httr responses directly, don't need content("text"))
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))
# A new GET using the same handle gets exactly the same response
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))
# Now call GET again after resetting the handle
httr::handle_reset("https://nzffdms.niwa.co.nz/search")
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))
В моем случае получение вышеуказанного кода дает мне:
[1] "ecd9be7c75559364a2a5568049c0313f"
[1] "ecd9be7c75559364a2a5568049c0313f"
[1] "d953ce7acc985adbf25eceb89841c713"
Яна Дуггар открыто говорила о своих поисках любви. Вот все, что она сказала на эту тему и о своем пятилетнем окне для замужества.
Звезда «Чужестранки» Сэм Хьюэн недавно рассказал, что он возьмет со съемочной площадки, чтобы вспомнить Джейми Фрейзера, роль, которая сделала его звездой.
«She Loves You» была написана за час, записана за день и стала песней The Beatles с одним из лучших исполнений в их карьере.
У Долли Партон и ее бабушки Бесси были особые отношения. Бабушка Партон была очень больна, но это не мешало Долли разыгрывать ее.
Вы можете подумать, что дуб или гикори — прочные породы дерева, но когда речь идет о самой твердой древесине в мире, они даже близко не стоят.
Океан полон красоты, но он также скрывает одних из самых страшных морских существ на планете. Многие из этих животных скрываются глубоко под поверхностью океана, в тёмном, полном давления мире морских глубин.
Если вы сражаетесь с враждебными мобами или готовитесь к PvP-боям, знание лучших чар для мечей в Minecraft может дать вам серьёзное преимущество. Зачарование мечей позволяет наносить больше урона, увеличивать количество выпадающих мобов и продлевать срок службы меча.
Когда говорят о социалистических странах, часто представляют себе полный государственный контроль и отсутствие частной собственности. Но на практике социалистические экономики сильно различаются.
В «Детях» появится громкая камео и несколько разрушительных новостей
Утверждается, что этот RAV4 находится в отличном состоянии и готов к игре в музыкальные стулья.
На кадрах, снятых с дрона, видно, как пожарные изо всех сил пытаются потушить пламя.
«Глаза Ваканды» напрямую связаны с MCU, а также обновления о «Людях Икс '97», «Что, если...», «Сорвиголова» и многом другом.
Ава Гарднер была замужем за Микки Руни и Фрэнком Синтрой, и встречалась с несколькими другими голливудскими звездами. Вот взгляд назад на историю знакомств Авы Гарднер.
Джон Клиз женился на Дженнифер Уэйд в 2012 году. Вот все, что нужно знать о жене Джона Клиза, Дженнифер Уэйд.
Олимпийская чемпионка Эллисон Феликс вышла замуж за своего мужа Кеннета Фергюсона в 2018 году. Вот все, что нужно знать о муже Эллисон Феликс, Кеннете Фергюсоне.
Мена Сувари замужем за своим мужем Майклом Хоупом с 2018 года. Вот все, что нужно знать о муже Мены Сувари.
Это поражает меня Внезапно, как это часто бывает, Это снова и снова на полпути <Нет, не то, что в Тихом океане, ты темно-бордовый, то, что на карнавале> Каждый громкий заголовок…..
В 2022 году, с выпуском GPT-3, навыки письма, кажется, стали менее важными. С помощью ИИ люди с плохим письмом также могут генерировать качественный персонал.
В современном быстро меняющемся и конкурентном мире карьера играет важную роль в личностном росте, финансовой стабильности и общей удовлетворенности жизнью. Однако многие люди оказываются в безжалостном цикле застоя и неудовлетворенности, постепенно угасая в своей профессиональной жизни.
На прошлой неделе я заметил пресс-релиз, разосланный через PressGazette (новостной веб-сайт британских СМИ). В статье сообщалось, что Acast, скандинавская компания по размещению и рекламе подкастов, возглавит консорциум «вероятно, самых влиятельных» издателей подкастинга.