Я помню, как отвечал на один или два вопроса о действительно подобном государственном юридическом портале, как этот, но они могут немного отличаться .Я также на 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
после =
- это номер страницы, так что вы можете просто использовать его (или что-то еще, что он дает для переменной приращения)и начните с последней пойманной страницы (так что вам нужно следить за этим).