【问题标题】:Fill in web form, submit and download results填写网页表格,提交和下载结果
【发布时间】:2019-09-29 22:20:08
【问题描述】:

我想填写web form 并提交我的查询并下载结果数据。一些字段可以选择下拉菜单或输入搜索查询,部分也可以留空(如果所有部分都留空,则整个数据库都已下载),点击“搜索和下载”按钮应该会启动下载文件。

这是我根据this 问题尝试过的(选择物种“Salmo salar”的所有记录)。我使用我的浏览器(Opera)“开发者工具”来检查页面元素并识别所有可能字段的名称:

library(httr)

url <- "https://nzffdms.niwa.co.nz/search"

fd <- list(
  search_catchment_no_name = "",
  search_river_lake = "",
  search_sampling_locality = "",
  search_fishing_method = "",
  search_start_year = "",
  search_end_year = "",
  search_species  = "Salmo salar", # species of interest
  search_download_format = 1,      # select csv file format
  submit = "Search and Download"
)

POST(url, body = fd, encode = "form")

我曾希望这会导致下载 csv 文件(物种“Salmo salar”的所有记录),但没有文件下载(但输出此文件(10 个列表,仅显示第一位):

Response [https://nzffdms.niwa.co.nz/search]
Date: 2019-10-02 23:35
Status: 200
Content-Type: text/html; charset=utf-8
Size: 19.1 kB
<!DOCTYPE html>  
  <html>  
  <head>  
  <meta http-equiv="Content-Type" content="text/html; c...
    <meta name="title" content="NZ Freshwater Fish Database...
<meta name="description" content="NIWA NZ Freshwater Fish...
<meta name="keywords" content="NIWA, NZ, Freshwater Fish" />
<meta name="language" content="en" />
<meta name="robots" content="index, follow />

...

编辑

我认为问题在于我如何调用Search and download 按钮,在检查网页时,大多数字段看起来像这样:

# end year field
<input maxlength="4" class="form-control" type="text" name="search[end_year]" id="search_end_year">

search and download 按钮元素没有nameid 选项:

<input type="submit" value="Search and Download" class="btn btn-primary btn-md">

另外我刚刚注意到有一个隐藏字段,也许我需要定义这个?

<input type="hidden" name="search[_csrf_token]" value="d1530f09c1ce8110b5163bd100cb0d67" id="search__csrf_token">

任何关于如何下载文件的建议将不胜感激。

更新 - 警告

截至2021-12-1,上述问题中所查询的数据库已大幅更新,该问题中的信息不再准确反映该网站,以下chinsoon12的相关答案如果提交将不再返回结果.

【问题讨论】:

    标签: r post httr


    【解决方案1】:

    首先,检查website 上的 robots.txt。自 2019 年 10 月 3 日起注释掉。

    然后阅读https://nzffdms.niwa.co.nz/termshttps://www.niwa.co.nz/freshwater-and-estuaries/nzffd/user-guide/tips 上的条款和条件,并确保您遵守条款和条件。

    限制下面的请求也很重要。

    检查所有条款和条件后,您可以使用以下代码查询您的数据:

    library(httr)
    library(xml2)
    
    gr <- GET("https://nzffdms.niwa.co.nz/search")
    doc <- read_html(content(gr, "text"))     #doc <- read_html(gr) #this works as well
    getTbl <- function(x) {
        do.call(rbind, lapply(xml_find_all(doc, paste0(".//select[@name='search",x,"']/option")),
            function(n) data.frame(NAME=xml_text(n), VALUE=xml_attr(n, "value"))))
    }
    fishing_method <- getTbl("[fishing_method]")
    species <- getTbl("[species][]")
    csrf_token <- xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
    
    fd <- list(
        "search[catchment_no_name]"="",
        "search[river_lake]"="",
        "search[sampling_locality]"="",
        "search[fishing_method]"="",
        "search[species][]"="",
        "search[species][]"=68,
        "search[start_year]"="",
        "search[end_year]"="",
        "search[download_format]"="1",
        "search[_csrf_token]"=csrf_token
    )
    r <- POST("https://nzffdms.niwa.co.nz/doSearch", body=fd, encode="form")
    read.csv(text=content(r, "text", encoding="UTF-8"))
    

    输出:

       card m    y catchname  catch        locality time  org map    east   north altitude penet fishmeth effort pass spcode abund number minl maxl  nzreach
    1  3964 1 1981   Waiau R 797.49       Lake Gunn   NA niwa d41 2122400 5581200      477   225      ang     NA   NA salsal    NA     NA   NA   NA 15006671
    2  3965 1 1981   Waiau R 797.49     Lake Fergus   NA niwa d41 2123700 5584400      483   229      ang     NA   NA salsal    NA     NA   NA   NA 15006092
    3 15975 1 2003   Waiau R 797.40 Excelsior Creek 1330 niwa d44 2095800 5495800      190    94      efp     80    1 salsal    NA      2  102  105 15030686
    4 50772 1 1940   Waiau R 797.49 Upukerora River   NA  unk d43 2098500 5519900      210   146      unk     NA   NA salsal    NA     NA   NA   NA 15020897
    

    【讨论】:

    • 谢谢。显然比我最初想象的要多一点。几个问题,1)如果 robots.txt 没有被注释掉(即它是活动的),那么我将无法通过 R 获取数据? 2) 重新检查条款和条件,某些数据库是否有不允许通过其他程序下载的规则? 3)在您的代码中,“节流”发生在哪里?或者只有当我想发送许多重复请求时?非常感谢。
    • 1) 如果它没有被注释掉,你需要阅读它,看看你是否被允许以编程方式查询它 2) 这取决于条款和条件,一些网站有严格的限制使用机器来查询他们的网站(通常有一个API可以正确查询数据)3)你可以在你的多次调用之间插入一些Sys.sleep(),这样服务器就不会过载。
    • 非常感谢您的出色回答,我学到了很多。如果没问题,我会有一个后续问题,但是在这里发表评论太长了,所以我发布了一个新问题:stackoverflow.com/questions/58219503/…。如果您有时间可以看一看,那就太好了!
    • 请问您是否对这个问题有提示:stackoverflow.com/questions/58805740/…。我尝试使用特定于会话的请求正文、cookie 和请求标头来解决它。但是请求仍然没有通过。 (也许它也不希望网站所有者有自动请求,这也是一个很好的答案)。这是我最好的尝试:stackoverflow.com/a/58924120/3502164。也许你有一个小提示?
    • @BigDataScientist 是的,你在正确的轨道上,但在你的 POST 查询中遗漏了一些东西。您需要在第一次 GET 之后解析出 __VIEWSTATE,因为它是一个 aspx。您需要在下一个 POST 查询中传递它。如果我没记错的话,您至少需要发送 3 个请求。
    猜你喜欢
    • 2015-10-20
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多