专栏首页进击的Coder还有 Selenium 抓不到的内容?

还有 Selenium 抓不到的内容?

有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。

今天我们不讨论字体反爬虫和 CSS 反爬虫这两种情况。我们来看一段非常简单的网页。这个网页只有一个HTML 文件,不加载特殊字体,不加载 CSS 文件。

这个网页的奇怪之处在哪里呢?我们试一试使用 XPath Helper 来提取网页上面的红色文字,发现XPath 竟然无法找到这段文字,如下图所示:

然后我们使用 Selenium 来试一试:

Selenium果然无法获取 红字到内容。我们再打印一下网页的源代码:

这一次,Selenium 获取到的源代码,竟然跟 Chrome 开发者工具里面显示的源代码不一样?

这个问题的关键,就在开发者工具里面的这样一段文字:

因为这个节点是一个shadow DOM[1]。shadow DOM 的行为跟 iframe很像,都是把一段HTML 信息嵌入到另一个 HTML 中。但不同的是,iframe被嵌入的地址需要额外再搭建一个 HTTP服务,而 shadow DOM 可以只嵌入一段 HTML 代码,所以它比 iframe 更节省资源。

在上面的截图中,通过下面这三行代码,我们把一个新的<p>标签嵌入到了原来的 HTML 中:

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

而这个被嵌入的影子标签,就像 iframe 一样,是无法直接使用 Selenium 提取的。如果强行提取,那么,我们需要使用 JavaScript 获取 shadow DOM,然后再进行提取。我们来看一段可以正常工作的代码:

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

运行效果如下图所示:

这段代码,首先通过 JavaScript 找到shadow-root的父节点元素,然后返回这个元素的.shadowRoot属性。在 Python 里面拿到这个属性以后,使用.find_element_by_class_name()方法获取里面的内容。

要特别注意的是,拿到shadow-root节点以后,只能通过 CSS 选择器进一步筛选里面的内容,不能用 XPath,否则会导致报错。

参考资料

[1]

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

End

本文分享自微信公众号 - 进击的Coder(FightingCoder)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一日一技:Selenium 抓不到的内容

    有一些同学在写爬虫的时候,过于依赖 Selenium,觉得只要使用模拟浏览器,在不被网站屏蔽的情况下,就可以爬到任何内容。

    青南
  • 自制 Python 脚本抓取文库资料,selenium+PhantomJS 爬虫初接触

    大家都应该有需要在百度文库下载文档的经历,或者充值成为微挨批(VIP),或者在某宝买券去下载,也有的勤勤恳恳的上传文章,慢慢的攒下载券,当然也有一点一点的复制粘...

    云飞
  • Python3网络爬虫实战-1、请求库安

    在第一步抓取页面的过程中,我们就需要模拟浏览器向服务器发出请求,所以需要用到一些 Python 库来实现 HTTP 请求操作,在本书中我们用到的第三方库有 Re...

    py3study
  • py+selenium 老是定位不到文本内容【已解决】

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invi...

    逆向小白
  • Selenium爬虫-获取浏览器Network请求和响应

    自从发现 Selenium 这块新大陆后,许多异步加载、js加密、动态Cookie等问题都变得非常简单,大大简化了爬虫的难度。

    jhao104
  • 左手用R右手Python系列——动态网页抓取与selenium驱动浏览器

    但是所有这些都是基于静态页面的(抓包与API访问的除外),很多动态网页不提供API访问,这样就只能寄希望于selenium这种基于浏览器驱动技术来完成。 好在R...

    企鹅号小编
  • Python爬虫自学系列(四)

    上一篇讲的是爬虫中的缓存,相对来说比较难一点,而且不是直接面向网页的,所以可能会比较无聊一点吧。

    看、未来
  • 左手用R右手Python系列——动态网页抓取与selenium驱动浏览器

    关于基础的网络数据抓取相关内容,本公众号已经做过很多次分享,特别是R语言的爬虫框架(RCurl+XML/httr+rvest[xml2+selectr])已经形...

    数据小磨坊
  • Python 网页抓取库和框架

    作为 Python 开发人员,您可以使用许多 Web 抓取工具。现在就来探索这些工具并学习如何使用它们。

    用户8847084
  • 使用Python轻松抓取网页

    抓取网页入门其实挺简单的。在之前的文章中我们介绍了怎么用C#和JAVA两种方法来抓取网页,这一期给大家介绍一种更容易,也是使用最广泛的一种抓取方法,那就是Pyt...

    Oxylabs中文站
  • 使用Selenium爬取淘宝商品

    崔庆才
  • 基于Selenium模拟浏览器爬虫详解

    Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome、firefox等主流浏览器。可以通过代码控制与页面上元素进行...

    昱良
  • 基于Selenium写的Python爬虫

    萌海无涯
  • web爬虫-用Selenium操作浏览器抓数据

    Selenium是一个基于Web的开源自动化工具。Python使用Selenium用于自动化测试。 特点是易于使用。Selenium可以将标准Python命令发...

    亚乐记
  • 公众号文章抓取工具python

    爬取微信公众号有三种方法: 第一种:用搜狗微信公众号搜过,这个只能收到前10条; 第二种:用fiddler或手机抓包,从访问链接去获得appmsg_token,...

    程序源代码
  • 为什么不推荐Selenium写爬虫

    最近在群里经常会看到有些朋友说,使用Selenium去采集网站,我看到其实内心是很难受的,哎!为什么要用Selenium呢? 我想说下自己的看法,欢迎各位大佬批...

    小歪
  • Python Selenium 设置元素等待的三种方式

    1. sleep 强制等待 2. implicitly_wait() 隐性等待 3. WebDriverWait()显示等待

    砸漏
  • python+selenium+requests爬取我的博客粉丝的名称

    一、爬取目标 1.本次代码是在python2上运行通过的,python3不保证,其它python模块 - selenium 2.53.6 +firefox 44...

    上海-悠悠
  • 爬虫 | selenium之爬取网易云音乐歌曲评论

    本文内容是利用 Selenium 爬取网易云音乐中的歌曲 《Five Hundred Miles》 的所有评论,然后存储到 Mongo 数据库。

    咸鱼学Python

扫码关注云+社区

领取腾讯云代金券