硒抓不到内容的示例分析

介绍

这篇文章主要为大家展示了“硒抓不到内容的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“硒抓不到内容的示例分析”这篇文章吧。

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

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

硒抓不到内容的示例分析

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

硒抓不到内容的示例分析

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

硒抓不到内容的示例分析

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

硒抓不到内容的示例分析

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

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

硒抓不到内容的示例分析

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

在上面的截图中,通过下面这三行代码,我们把一个新的

标签嵌入到了原来的HTML中:

 var  content =, document.querySelector (& # 39; .content& # 39;),,,,,, var  root =, content.attachShadow({模式:& # 39;开放# 39;}),,,,,,root.innerHTML =, & # 39; & lt; p 类=皉eal_content",风格=把丈?,red"在你抓不到这段文字的! & lt;/p> & # 39; 

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

 shadow =, driver.execute_script (& # 39; return  document.querySelector (“.content") .shadowRoot& # 39;), content =, shadow.find_element_by_class_name (& # 39; real_content& # 39;),打印(content.text) 

运行效果如下图所示:

硒抓不到内容的示例分析

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

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

以上是“硒抓不到内容的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

硒抓不到内容的示例分析