r - 禁用对话框 - 另存为 - Rselenium

标签 r web-scraping rvest httr rselenium

我在我的 MacBook 上使用 RSelenium 来抓取公开可用的 .csv 文件。到目前为止提出的其他问题都没有对我特别有帮助的答案。请不要将其标记为重复项。

对于 Firefox,我无法禁用该对话框。我尝试了很多不同的东西。

根据 Firefox,我尝试下载的文件的 MIME 类型 text/csv;字符集=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/ 中提取数据检查马里兰州不同类型和司法管辖区的案件。提交给巡回法院的数据请求已被接受;但是,保管人可能无法在合理的时间内(最多几个月)将其提供给我。因此,我正在自己抓取数据。

到目前为止,我编写的代码会自动进入条款和条件页面,输入字母表中的一个字母 - 比如说 A,仅选择巡回法院,选择一组日期,选择一个司法管辖区,然后搜索所有案件.在页面底部,有一个选项可以下载 .csv 格式的记录。我有代码点击这个。我的所有代码都以错误消息的存在为条件。如果弹出这些错误消息,我会返回并更新日期,直到消息消失。

Chrome 将我限制为 100 次下载。由于我今天早些时候发布了代码,所以我将记录合成到一个更大的 .csv 文件中,然后在到达我为字母表中的特定字母选择的搜索日期结束时删除所有类似命名的文件。这将适用于大多数县。我将在安妮阿伦德尔县、巴尔的摩市、巴尔的摩县、霍华德县和蒙哥马利县的巡回法院遇到问题;在这些司法管辖区,鉴于这些县的治安和犯罪水平,我基本上必须每天下载记录。这意味着数以千计的 .csv 文件。 Chrome 的限制确实让它变得很麻烦。

如果有人能帮我从我的 R 代码中清除这个对话框问题,那么我将非常感激。我相信其他人也有或将会有同样的问题。

最佳答案

我记得为一个真的类似的州法律门户网站回答过一两个问题,但它们可能略有不同。我也 100% 不同意这不是一个重复的问题。您选择解决问题的方式可能有点新颖(不是,但您明白我的意思)但是只是因为您选择了一种糟糕的方式来解决它并不意味着实际的事情不是其他 100 种方法的复制品关于迭代抓取和维护状态的问题。

所以,首先:Selenium 是 100% 不必要的。

其次:该站点的 session 超时小得离谱,这可能是导致出现错误的一个因素。该对话框可能仍会“出现”在我下面显示的内容中,但如果您这样做,我会提出一种可能的解决方法。

我们只需要启动 httr 动词使其像浏览器一样运行,并使用底层 libcurl 库/curl 包的功能来保持 session 得到你想要的。

以下是适度注释,但您已经了解了 Selenium,所以您实际上各种了不起,除非您想要更多,否则我将保留它稀疏每个步骤中的信息。基本习语是:

  • 启动 session
  • 填写表格(这个数字等价物将您绑定(bind)到同一个当面点击,这很酷)
  • 开始搜索
  • 在结果页面上
    • 找到 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 ---------------------------------------------

因此,正如我所说,该站点在 session 方面非常激进。您可以测试非搜索结果页面或测试重新确认页面,然后执行相同的基本 POST 以重新提交并刷新 session 。此外,在我的工作中,有一个查询参数:d-16544-p=22 之后的 = 是页面number 这样您就可以使用它(或者它为您提供的任何增量变量)并从捕获的最后一页开始(因此您需要跟踪它)。

关于r - 禁用对话框 - 另存为 - Rselenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53296807/

相关文章:

javascript - 将鼠标悬停在 Shiny 中的元素上时如何更改情节?

python - beautifulsoup解析html标签异常

r - 使用 rvest 或 RSelenium 来抓取表

html - 使用rvest,如何从submit_form()返回的对象中提取html内容

r - 除当前行之外的所有组成员

r - 在不规则的 xts 前加上零

r - 如何让 `pkgdown` 在小插图中使用图形编号和交叉引用?

python - 在 Python 中抓取第二页会产生与浏览到第二页不同的数据

python - 如何提取特定类名的文本,后跟特定文本?

xml - 如何将 HTML R 对象转换为字符?