r - 禁用对话框 - 另存为 - Rselenium
问题描述
我在我的 MacBook 上使用 RSelenium 来抓取公开可用的 .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/提取数据,以检查马里兰州不同类型和司法管辖区的案件。提交给巡回法院的数据请求已被接受;但是,保管人可能无法在合理的时间内(最多几个月)将其提供给我。因此,我自己在抓取数据。
到目前为止,我编写的代码会自动通过条款和条件页面,输入字母表中的一个字母——比如 A,只选择巡回法院,选择一组日期,选择一个司法管辖区,然后搜索所有案件。在页面底部,有一个以 .csv 格式下载记录的选项。我有点击这个的代码。我的所有代码都以存在错误消息为条件。如果弹出这些错误消息,那么我会返回并更新日期,直到消息消失。
Chrome 将我限制为 100 次下载。由于我今天早些时候发布了代码,我将记录合成到一个更大的 .csv 文件中,然后在它到达我为特定字母选择的搜索日期结束时删除所有类似命名的文件。这将适用于大多数县。我将遇到安妮阿伦德尔县、巴尔的摩市、巴尔的摩县、霍华德县和蒙哥马利县巡回法院的问题;在这些司法管辖区,鉴于这些县的治安和犯罪水平,我基本上必须每天下载记录。这意味着成千上万的 .csv 文件。Chrome 的限制确实让它变得很麻烦。
如果有人可以帮助我从我的 R 代码中清除此对话框问题,那么我将非常感激。我相信其他人有或将会有同样的问题。
解决方案
我记得曾为类似的州法律门户网站回答过一两个问题,但它们可能略有不同。我也会 100% 不同意这不是一个重复的问题。你选择解决问题的方式可能有点新奇(不是,但你明白我的意思)但只是 b/c 你选择了一种不好的方式来攻击它并不意味着实际的事情不是其他 100 个重复关于迭代抓取和维护状态的问题。
所以,首先:硒是 100% 没有必要的。
第二:该站点的会话超时非常小,这可能是您收到错误的一个因素。该对话框可能仍会“出现”在下面显示的内容中,但如果您这样做,我将介绍一种可能的解决方法。
我们只需要httr
启动动词,使其像浏览器一样工作,并使用底层libcurl
库/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
是=
页码,所以你可以使用它(或者它为你提供的增量变量)并从捕获的最后一页开始(所以你需要跟踪它)。
推荐阅读
- class - 使用一个类的属性,而不必每次都写下它的名字
- python - 我正在制作一个 Discord 机器人,但是当机器人使用 Rythm 命令时,什么也没有发生。有没有办法来解决这个问题?
- python - 如何在 Python Pandas 中对具有计数唯一值的多列进行分组
- python - 更新列值以反映具有两个不同大小数据框的其他列值
- swift5 - 向 CLLocationDistance 添加一些计算
- html - 如果它们都共享同一个 Div 类,我如何使用 Selenium 单击第三个 Div 类“链接”?
- python - pyspark 代码排名分区问题我哪里做错了?
- python-3.x - 关于用python编辑很长的句子的问题
- url - Fabric-CA 无法读取未定义的属性“url”
- python-requests - 如何修复 VS 代码中的“点子无法识别错误”