【问题标题】:Rvest not recognizing css selectorRvest 无法识别 CSS 选择器
【发布时间】:2016-04-01 03:23:48
【问题描述】:

我正在尝试抓取这个网站:

http://www.racingpost.com/greyhounds/result_home.sd#resultDay=2015-12-26&meetingId=18&isFullMeeting=true

通过 R 中的 rvest 包。

不幸的是,rvest 似乎无法通过 CSS 选择器识别节点。

例如,如果我尝试提取 CSS 选择器为“.black”的每个表(等级、奖品、距离)的标题中的信息,然后运行以下代码:

URL <- read_html("http://www.racingpost.com/greyhounds/result_home.sd#resultDay=2015-12-26&meetingId=18&isFullMeeting=true")
nodes<-html_nodes(URL, ".black") 

nodes 是一个空列表,所以它不会抓取任何东西。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    它发出 XHR 请求来生成 HTML。试试这个(这也应该更容易自动化数据捕获):

    library(httr)
    library(xml2)
    library(rvest)
    
    res <- GET("http://www.racingpost.com/greyhounds/result_by_meeting_full.sd",
               query=list(r_date="2015-12-26",
                          meeting_id=18))
    
    doc <- read_html(content(res, as="text"))
    
    html_nodes(doc, ".black")
    ## {xml_nodeset (56)}
    ##  [1] <span class="black">A9</span>
    ##  [2] <span class="black">£61</span>
    ##  [3] <span class="black">470m</span>
    ##  [4] <span class="black">-30</span>
    ##  [5] <span class="black">H2</span>
    ##  [6] <span class="black">£105</span>
    ##  [7] <span class="black">470m</span>
    ##  [8] <span class="black">-30</span>
    ##  [9] <span class="black">A7</span>
    ## [10] <span class="black">£61</span>
    ## [11] <span class="black">470m</span>
    ## [12] <span class="black">-30</span>
    ## [13] <span class="black">A5</span>
    ## [14] <span class="black">£66</span>
    ## [15] <span class="black">470m</span>
    ## [16] <span class="black">-30</span>
    ## [17] <span class="black">A8</span>
    ## [18] <span class="black">£61</span>
    ## [19] <span class="black">470m</span>
    ## [20] <span class="black">-20</span>
    ## ...
    

    【讨论】:

    • 优秀。谢谢你。我可能认为这与我在其他网站上遇到的问题相同,您知道我在哪里可以找到有关如何在我拥有动态网站时提取查询的信息?
    • 开发者工具和 Burp 套件。通常需要一些工作。
    • 有相关指南吗?
    • 此代码不起作用,正在抛出错误“curl::curl_fetch_memory(url, handle = handle) 中的错误:已达到超时”
    • 那不是代码的问题,是网站的问题。 R 不能强制网站启动。
    【解决方案2】:

    您的选择器很好,rvest 工作正常。问题是 您要查找的内容不在 url 对象中

    如果您打开该网站并使用网络浏览器检查工具,您将看到您想要的所有数据都是&lt;div id="resultMainOutput"&gt; 的后代。现在,如果您查找本网站的源代码,您将看到以下内容(为便于阅读添加了换行符):

    <div id="resultMainOutput">
        <div class="wait">
           <img src="http://ui.racingpost.com/img/all/loading.gif" alt="Loading..." />
        </div>
    </div>
    

    您想要的数据动态加载rvest 无法处理。它只能获取网站源代码并检索没有任何客户端处理的任何内容。

    rvest-introducing blog post 中提出了完全相同的问题,这是包作者不得不说的:

    对于这样的页面,您有两种选择:

    1. 使用 Web 浏览器中的调试控制台对通信协议进行逆向工程,并直接从服务器请求原始数据。

    2. 使用像 RSelenium 这样的包来自动化 Web 浏览器。

    如果您不需要重复获取该数据,或者您可以在每次分析中接受一些手动工作,最简单的解决方法是:

    1. 在选择的网络浏览器中打开网站
    2. 使用网络浏览器检查工具,复制当前网站内容(整个页面或仅&lt;div id="resultMainOutput"&gt;内容)
    3. 将该内容粘贴到文本编辑器中并将其另存为新文件
    4. 对该文件运行分析
    > url <- read_html("/tmp/racingpost.html")
    > html_nodes(url, ".black")
    # {xml_nodeset (56)}
    # [1] <span class="black">A9</span>
    # [2] <span class="black">£61</span>
    # [3] <span class="black">470m</span>
    # [4] <span class="black">-30</span>
    # (skip the rest)
    

    如您所见,在此过程中存在一些编码问题,但可以稍后解决。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2018-01-22
      • 2021-11-24
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多