【问题标题】:Scrape website with R by navigating doPostBack通过导航 doPostBack 使用 R 抓取网站
【发布时间】:2017-05-25 06:59:52
【问题描述】:

我想从以下站点定期提取表格。

单击构建块名称时价格表会发生变化(BLOK 16 A,BLOK 16 B,BLOK 16 C,...)。 URL 不变,页面通过触发改变

javascript:__doPostBack('ctl00$ContentPlaceHolder1$DataList2$ctl04$lnk_blok','')

我在google和starckoverflow搜索后尝试了3种方法。

我尝试过的没有 1:这不会触发 doPostBack 事件。

postForm( "http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44", ctl00_ContentPlaceHolder1_DataList2_ctl03_lnk_blok="ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok")

我试过的没有 2: selenium 遥控器似乎可以在 (http://localhost:4444/) 上运行,但 remotedriver 无法导航。返回此错误。 (checkError(res) 中的错误: httr 调用中的未定义错误。 httr 输出:length(url) == 1 is not TRUE)

library(RSelenium)
startServer()
remDr <- remoteDriver()
remDr <- remoteDriver(remoteServerAddr = "localhost" 
                  , port = 4444L, browserName = "firefox")
remDr$open()
remDr$getStatus()
remDr$navigate("http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44")

我尝试过的没有 3:这是触发 dopostback 事件的另一种方式。它无法导航。

base.url <- "http://www.kentkonut.com.tr/tr/modul/projeler/",
event.target <- 'ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok',
action <- "daire_fiyatlari.aspx?id=44"

ftarget <- paste0(base.url, action)
dum <- getURL(ftarget)
event.val <- unlist(strsplit(dum,"__EVENTVALIDATION\" value=\""))[2]
event.val <- unlist(strsplit(event.val,"\" />\r\n\r\n<script"))[1]
view.state <- unlist(strsplit(dum,"id=\"__VIEWSTATE\" value=\""))[2]
view.state <- unlist(strsplit(view.state,"\" />\r\n\r\n\r\n<script"))[1]
web.data <- postForm(ftarget, "form name" = "ctl00_ContentPlaceHolder1_DataList2_ctl03_lnk_blok", 
                   "method" = "POST", 
                   "action" = action, 
                   "id" = "ctl00_ContentPlaceHolder1_DataList2_ctl03_lnk_blok",
                   "__EVENTTARGET"=event.target,
                   "__EVENTVALIDATION"=event.val,
                   "__VIEWSTATE"=view.state)

感谢您的帮助。

【问题讨论】:

    标签: r web-scraping rcurl rvest rselenium


    【解决方案1】:
    library(rvest)    
    url<-"http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44"
        pgsession<-html_session(url) 
        t<-html_table(html_nodes(read_html(pgsession), css = "#ctl00_ContentPlaceHolder1_DataList1"), fill= TRUE)[[1]]
        even_indices<-seq(2,length(t$X1),2)
        t<-t[even_indices,]
        t<-t[2:(length(t$X1)),]
    

    编辑代码:

    library(rvest)    
    url<-"http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44"
    pgsession<-html_session(url)
    pgform<-html_form(pgsession)[[1]]
    page<-rvest:::request_POST(pgsession,"http://www.kentkonut.com.tr/tr/modul/projeler/daire_fiyatlari.aspx?id=44",
                               body=list(
                                 `__VIEWSTATE`=pgform$fields$`__VIEWSTATE`$value,
                                 `__EVENTTARGET`="ctl00$ContentPlaceHolder1$DataList2$ctl01$lnk_blok",
                                 `__EVENTARGUMENT`="",
                                 `__VIEWSTATEGENERATOR`=pgform$fields$`__VIEWSTATEGENERATOR`$value,
                                 `__VIEWSTATEENCRYPTED`=pgform$fields$`__VIEWSTATEENCRYPTED`$value,
                                 `__EVENTVALIDATION`=pgform$fields$`__EVENTVALIDATION`$value
                               ),
                               encode="form"
                               )
    # in the above example change eventtarget as "ctl00$ContentPlaceHolder1$DataList2$ctl02$lnk_blok" to get different table
    
    t<-html_table(html_nodes(read_html(page), css = "#ctl00_ContentPlaceHolder1_DataList1"), fill= TRUE)[[1]]
    even_indices<-seq(2,length(t$X1),2)
    t<-t[even_indices,]
    t<-t[2:(length(t$X1)),]
    

    【讨论】:

    • 感谢@Bharath,您获取表格的方式非常清晰,谢谢。我需要从该站点爬取的不是页面 id,而是通过触发 js ctl00$ContentPlaceHolder1$DataList2$ctl00$lnk_blok ctl00$ContentPlaceHolder1$DataList2$ctl01$lnk_blok 单击到 BLOK 16 B 或 BLOK 16 C 时出现的子页面ctl00$ContentPlaceHolder1$DataList2$ctl02$lnk_blok ctl00$ContentPlaceHolder1$DataList2$ctl03$lnk_blok
    • 抱歉,不,当您单击此图片上的黄色链接时postimg.org/image/edbocvd3z URL 不会更改,但下表会更改
    • 谢谢,成功了。这是 js 的专业知识还是其他什么?
    • @Bharath 尝试了您的技术,但无法浏览我选择用于掌握艺术的随机页面的“下一步”按钮。这是链接,如果这更有意义,我可以打开一个新线程content.smctradeonline.com/Commodity/SpotPrices.aspx?id=24
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多