Отключить диалоговое окно - Сохранить как - Rselenium - PullRequest
0 голосов
/ 14 ноября 2018

Я использую RSelenium на своем MacBook для очистки общедоступных файлов .csv.Ни на один из заданных вопросов не было ответов, которые были бы особенно полезны для меня.Пожалуйста, не отмечайте это как дубликат.

Что касается Firefox, я не могу отключить диалоговое окно.Я пробовал несколько разных вещей.

Согласно Firefox, MIME-тип файла, который я пытаюсь загрузить text/csv; charset=UTF-8.Однако выполнение следующего кода все равно вызывает появление диалогового окна:

fprof <- makeFirefoxProfile(list(browser.download.dir = "~/Scrape"
                             ,browser.download.folderList = 2L
                             ,browser.download.manager.showWhenStarting = FALSE
                             ,browser.download.manager.showAlertOnComplete = FALSE
                             ,browser.helperApps.neverAsk.openFile = "text/csv; charset=UTF-8"
                             ,browser.helperApps.neverAsk.saveToDisk = "text/csv; charset=UTF-8"))
browser <- remoteDriver(port = 5556, browserName = "firefox", extraCapabilities = fprof)

Я пробовал несколько различных правок, включая редактирование MIME в text/csv, а также application/octet-stream.Ни одна из них не работает.Я создал профиль Firefox с уже имеющимися функциями, чтобы избежать диалогового окна.Это тоже не повезло.

Я пытался перейти на Chrome, но, увы ... там я столкнулся с другой проблемой.После 100 элементов Chrome не позволяет автоматически загружать файлы.Моя функция очистки довольно сложна, и единственное решение проблемы подобного типа было не очень ясным.

Я определяю следующие возможности для Chrome, но он не отключает ограничение в 100 скачиваний.

 eCaps <- list(
  chromeOptions = 
    list(prefs = list(
      "profile.default_content_settings.popups" = 0L,
      "download.prompt_for_download" = FALSE,
      "download.default_directory" = "~/Desktop/WebScrape"


    )
    )
)

browser <- remoteDriver(port = 5556, browserName = "chrome",extraCapabilities = eCaps)

Я рад принять любые предложения.Я часами пытался разобраться с этой проблемой.Любая помощь приветствуется.

Редактировать: чтобы предоставить более подробную информацию, я исследователь и кандидат наук, заинтересованных в реформе уголовного правосудия.Я извлекаю данные из http://casesearch.courts.state.md.us/casesearch/ для изучения дел различных типов и юрисдикций в штате Мэриленд.Запрос данных, представленный в окружной суд, принят;однако хранители могут не иметь возможности предоставить его мне в разумные сроки (до нескольких месяцев).Поэтому я собираю данные сам.

Код, который я написал до сих пор, автоматически попадает на страницу условий и положений, вводит букву алфавита - скажем, А, выбирает только Окружной суд, выбирает набор дат, выбирает юрисдикцию и затем ищетдля всех случаев.Внизу страницы есть возможность скачать записи в формате .csv.У меня есть код, нажав на это.Я обусловливаю весь свой код наличием сообщений об ошибках.Если эти сообщения об ошибках всплывают, то я возвращаюсь и обновляю даты, пока сообщение не исчезнет.

Chrome ограничивает меня до 100 загрузок.Поскольку сегодня я разместил код ранее, я синтезировал записи в больший файл .csv, а затем удаляю все файлы с одинаковыми именами, как только он достигает конца дат поиска, которые я выбрал для определенной буквы алфавита.Это будет работать для большинства округов.У меня возникнут проблемы с окружными судами округа Анн Арундел, города Балтимор, округа Балтимор, округа Ховард и округа Монтгомери;в этих юрисдикциях мне, по сути, приходится ежедневно загружать записи, учитывая уровень полицейской деятельности и преступности в этих округах.Это означает тысячи файлов .csv.Ограничение Chrome действительно делает его громоздким.

Если кто-то может помочь мне очистить эту проблему диалогового окна от моего кода R, то я был бы очень благодарен.Я уверен, что другие имеют или будут иметь тот же вопрос.

1 Ответ

0 голосов
/ 14 ноября 2018

Я помню, как отвечал на один или два вопроса о действительно подобном государственном юридическом портале, как этот, но они могут немного отличаться .Я также на 100% не согласен с тем, что это не повторяющийся вопрос.Способ, которым вы решили атаковать проблему, может быть несколько новым (это не так, но вы понимаете, что я имею в виду), но просто потому, что вы выбрали плохой способ атаковать, это не означает, что реальная вещь не является дубликатом 100 другихвопросы об итеративной очистке и поддержании состояния.

Итак, во-первых: Selenium не нужен на 100%.

Во-вторых: у этого сайта есть смехотворно маленький тайм-аут сеанса, который можетбыть фактором, почему вы получаете ошибку.Этот диалог все еще может «появляться» в том, что я показываю ниже, но я расскажу об одном возможном способе его обойти, если вы это сделаете.

Нам просто нужно набрать httr глаголов, чтобы они действовали как браузери используйте базовый пакет libcurl library / curl для удержания сеанса, чтобы получить то, что вы хотите.

Ниже приведено скромно с комментариями, но вы выяснили Selenium, так что вына самом деле все виды удивительны , и я оставлю это разреженным, если вы не хотите больше информации на каждом шаге.Основная идиома состоит в том, чтобы:

  • заполнить сессию
  • заполнить форму (и этот цифровой эквивалент привязывает вас к тому же личному щелчку, так что это круто)
  • начать поиск
  • на странице результатов
    • найти ссылку CSV и загрузить файл
    • найти ссылку "Далее" и перейти к ней

делать последнюю вещь в итерации столько раз, сколько вам нужно.

library(httr)

# Start scraping ----------------------------------------------------------

httr::GET( # setup cookies & session
  url = "http://casesearch.courts.state.md.us/casesearch/",
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0"),
  httr::accept("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
  verbose() # remove when done monitoring 
) -> res 


# Say "yes" ---------------------------------------------------------------

httr::POST( # say "yes" to the i agree
  url = "http://casesearch.courts.state.md.us/casesearch/processDisclaimer.jis",
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0"),
  httr::accept("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
  httr::add_headers(
    `Referer` = 'http://casesearch.courts.state.md.us/casesearch/'
  ),
  body = list(
    disclaimer = "Y", 
    action = "Continue"
  ),
  encode = "form",
  verbose() # remove when done monitoring 
) -> res

# Search! -----------------------------------------------------------------

httr::POST( # search!
  url = "http://casesearch.courts.state.md.us/casesearch/inquirySearch.jis",
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0"),
  httr::accept("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
  httr::add_headers(
    `Referer` = 'http://casesearch.courts.state.md.us/casesearch/inquirySearch.jis'
  ),
  body = list(
    lastName = "SMITH", 
    firstName = "", 
    middleName = "", 
    partyType = "", 
    site = "00",
    courtSystem = "B", 
    countyName = "", 
    filingStart = "", 
    filingEnd = "", 
    filingDate = "", 
    company = "N", 
    action = "Search"
  ),
  encode = "form",
  verbose() # remove when done monitoring 
) -> res


# Get CSV URL and download it ---------------------------------------------

pg <- httr::content(res)
html_nodes(pg, xpath=".//span[contains(@class, 'export csv')]/..") %>% 
  html_attr("href") -> csv_url

httr::GET(
  url = sprintf("http://casesearch.courts.state.md.us/%s", csv_url),
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0"),
  httr::write_disk("some-file-name-you-increment-01.csv")
)

# Get the Next URL and go to it -------------------------------------------

html_nodes(pg, xpath=".//a[contains(., 'Next')]")[1] %>% 
  html_attr("href") -> next_url

httr::GET(
  url = sprintf("http://casesearch.courts.state.md.us/%s", next_url),
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0")
) -> res


# Get CSV … lather / rinse / repeat ---------------------------------------

pg <- httr::content(res)
html_nodes(pg, xpath=".//span[contains(@class, 'export csv')]/..") %>% 
  html_attr("href") -> csv_url

httr::GET(
  url = sprintf("http://casesearch.courts.state.md.us/%s", csv_url),
  httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0"),
  httr::write_disk("some-file-name-you-increment-02.csv")
)

# Prbly put ^^ in an iterator ---------------------------------------------

Так что, как я уже сказал, сайт довольно агрессивен в отношении сессий.Вы можете проверить страницу, не содержащую результатов поиска, или страницу для повторного подтверждения, а затем выполнить те же основные действия POST, чтобы повторно отправить и обновить сеанс.Кроме того, в моей работе через него был параметр запроса: d-16544-p=2 и 2 после = - это номер страницы, так что вы можете просто использовать его (или что-то еще, что он дает для переменной приращения)и начните с последней пойманной страницы (так что вам нужно следить за этим).

...