代码之家  ›  专栏  ›  技术社区  ›  jyjek

用R中的react JS抓取网页

  •  3
  • jyjek  · 技术社区  · 6 年前


    我在试着把下面的一页擦掉: https://metro.zakaz.ua/uk/?promotion=1
    此页包含react内容。
    我可以用代码刮第一页:

    url="https://metro.zakaz.ua/uk/?promotion=1"
    
    read_html(url)%>%
      html_nodes("script")%>%
      .[[8]] %>% 
      html_text()%>%
      fromJSON()%>%
      .$catalog%>%.$items%>%
      data.frame
    

    结果我有了第一页的所有条目,但我不知道如何刮其他页面。
    如果这有助于:

    document.querySelectorAll('.catalog-pagination')[0].children[1].children[0].click()
    

    谢谢你的帮助!

    2 回复  |  直到 6 年前
        1
  •  2
  •   ryanhnkim    6 年前

    您需要“RSelenum”来执行无头导航。

    检查设置: How to set up rselenium for R?

    library(RSelenium)
    library(rvest)
    library(tidyvers)
    
    url="https://metro.zakaz.ua/uk/?promotion=1"
    
    rD <- rsDriver(port=4444L, browser="chrome")
    remDr <- rD[['client']]
    
    remDr$navigate(url)
    
    ### adjust items you want to scrape 
        src <- remDr$getPageSource()[[1]]
    
        pg <- read_html(src)
        tbl <- tibble(
                        product_name = pg %>% html_nodes(".product-card-name") %>% html_text(),
                        product_info = pg %>% html_nodes(".product-card-info") %>% html_text()
                        )
    
    ## to handle pagenation (tested with 5 pages) - adjust accordinly
    for (i in 2:5) {
        pages <- remDr$findElement(using = 'css selector',str_c(".page:nth-child(",i,")"))
    
        pages$clickElement()  
    
        ## wait 5 sec to load
        Sys.sleep(5)
    
        src <- remDr$getPageSource()[[1]]
    
            pg <- read_html(src)
            data <- tibble(
                        product_name = pg %>% html_nodes(".product-card-name") %>% html_text(),
                        product_info = pg %>% html_nodes(".product-card-info") %>% html_text()
                        )
            tbl <- tbl %>% bind_rows(data)
    }
    
    nrow(tbl)
    head(tbl)
    tail(tbl)
    

    下面是一个快速输出:

    Output

        2
  •  2
  •   ThunderHorn    6 年前

    试着稍微调整一下你的代码

        from selenium import webdriver
    
        driver = webdriver.Firefox()
        current_page = 1
        url="https://metro.zakaz.ua/uk/?promotion="+str(current_page)
    
        driver.get(url)
        #gets all elements with class page 
        pages = driver.find_elements_by_class_name("page")
    
        for i in pages:
             #it will update the code every time it has clicked on to a page button
             html = driver.page_source
             #Here you put your code for scrapping and that's it 
             #gets the next page and will continue till there are no more pages
             if int(i.text) == current_page + 1:
                i.click()
                current_page +=1