禁用对话框-另存为-Rselenium

时间:2018-11-14 09:26:18

标签: r web-scraping rvest httr rselenium

我在MacBook上使用RSelenium刮擦了公共可用的.csv文件。到目前为止提出的其他问题都没有一个对我特别有帮助的答案。请不要将此标记为重复。

关于Firefox,我无法禁用该对话框。我尝试了许多不同的方法。

根据Firefox,我要下载的文件text/csv; charset=UTF-8的MIME类型。但是,执行以下代码仍会导致出现对话框:

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/csvapplication/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代码中清除此对话框问题,那么我将非常感激。我相信其他人也会或将会有同样的问题。

1 个答案:

答案 0 :(得分:1)

我记得针对一个确实个类似州法律门户网站的问题回答了一两个问题,但它们可能略有不同。我也会100%反对这不是重复的问题。您选择的解决问题的方式可能有点新颖(不是,但您明白了我的意思),但是b / c您选择了一种不好的攻击方式,但这并不意味着实际情况并非其他100倍有关迭代刮取和维护状态的问题。

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

第二:该站点的会话超时非常短,这可能是导致您出错的一个因素。该对话框可能仍会“显示”在我在下面显示的内容中,但是如果有的话,我将介绍一种解决它的可能方法。

我们只需要给httr动词加撇号以使其像浏览器一样,并使用基础的libcurl库/ curl包的功能来进行会话以获取所需的内容。

下面的注释是谦虚的,但是您已经弄清楚了硒,所以您实际上是各种各样的,除非您想要更多,否则我将使其保持稀疏状态。每个步骤中的信息。基本成语是:

  • 准备会议
  • 填写表格(此数字等效项将您绑定到相同的亲自点击,这很酷)
  • 开始搜索
  • 在结果页面上
    • 找到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之后的=是页码,因此您可以使用它(或它提供的任何值)您可以选择递增变量),然后从捕获的最后一页开始(因此,您需要对其进行跟踪)。