<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          還有Selenium 抓不到的內(nèi)容?

          共 1712字,需瀏覽 4分鐘

           ·

          2021-05-17 08:26


          有一些同學(xué)在寫爬蟲的時(shí)候,過于依賴 Selenium,覺得只要使用模擬瀏覽器,在不被網(wǎng)站屏蔽的情況下,就可以爬到任何內(nèi)容。

          今天我們不討論字體反爬蟲和 CSS 反爬蟲這兩種情況。我們來看一段非常簡單的網(wǎng)頁。這個(gè)網(wǎng)頁只有一個(gè)HTML 文件,不加載特殊字體,不加載 CSS 文件。

          這個(gè)網(wǎng)頁的奇怪之處在哪里呢?我們?cè)囈辉囀褂?XPath Helper 來提取網(wǎng)頁上面的紅色文字,發(fā)現(xiàn)XPath 竟然無法找到這段文字,如下圖所示:

          然后我們使用 Selenium 來試一試:

          Selenium果然無法獲取 紅字到內(nèi)容。我們?cè)俅蛴∫幌戮W(wǎng)頁的源代碼:

          這一次,Selenium 獲取到的源代碼,竟然跟 Chrome 開發(fā)者工具里面顯示的源代碼不一樣?

          這個(gè)問題的關(guān)鍵,就在開發(fā)者工具里面的這樣一段文字:

          因?yàn)檫@個(gè)節(jié)點(diǎn)是一個(gè)shadow DOM[1]。shadow DOM 的行為跟 iframe很像,都是把一段HTML 信息嵌入到另一個(gè) HTML 中。但不同的是,iframe被嵌入的地址需要額外再搭建一個(gè) HTTP服務(wù),而 shadow DOM 可以只嵌入一段 HTML 代碼,所以它比 iframe 更節(jié)省資源。

          在上面的截圖中,通過下面這三行代碼,我們把一個(gè)新的<p>標(biāo)簽嵌入到了原來的 HTML 中:

              var content = document.querySelector('.content');
              var root = content.attachShadow({mode'open'});
              root.innerHTML = '<p class="real_content" style="color: red">你抓不到這段文字的!</p>'

          而這個(gè)被嵌入的影子標(biāo)簽,就像 iframe 一樣,是無法直接使用 Selenium 提取的。如果強(qiáng)行提取,那么,我們需要使用 JavaScript 獲取 shadow DOM,然后再進(jìn)行提取。我們來看一段可以正常工作的代碼:

          shadow = driver.execute_script('return document.querySelector(".content").shadowRoot')
          content = shadow.find_element_by_class_name('real_content')
          print(content.text)

          運(yùn)行效果如下圖所示:

          這段代碼,首先通過 JavaScript 找到shadow-root的父節(jié)點(diǎn)元素,然后返回這個(gè)元素的.shadowRoot屬性。在 Python 里面拿到這個(gè)屬性以后,使用.find_element_by_class_name()方法獲取里面的內(nèi)容。

          要特別注意的是,拿到shadow-root節(jié)點(diǎn)以后,只能通過 CSS 選擇器進(jìn)一步篩選里面的內(nèi)容,不能用 XPath,否則會(huì)導(dǎo)致報(bào)錯(cuò)。

          參考資料

          [1]

          shadow DOM: https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_shadow_DOM



          往期推薦

          強(qiáng)烈推薦:GitHub 上 13 個(gè) Python 學(xué)習(xí)資源 (留言送書)

          2021-05-14

          假裝很忙的2個(gè)命令行工具

          2021-05-14

          這些年,我是如何學(xué)習(xí)C++的?

          2021-05-13

          面向監(jiān)獄編程,就靠它了

          2021-05-13



          今天因?yàn)槟狞c(diǎn)贊和在看,讓我元?dú)鉂M滿!
          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品人妻系列 | 一日本免费A | 天堂青草福利视频 | 天天干天天曰 | 91视频在线观看18 |