解决爬取隐藏数据问题的思考

问题|Python Selenium爬取网页长文章,当文章底部出现“展开阅读全文”时,未展开部分文章内容无法被正常爬取。

我们在使用网页浏览器查看某些文章时,常在文章可见部分内容的尾部发现“展开阅读全文”,这时就需要我们手动执行二次点击后才能继续查看剩下的内容。
在这里插入图片描述

如果我们使用Python+Selenium直接爬取该类网页文章时,会发现未展开部分的内容是无法被正常爬取的,如下:

执行代码:在这里插入图片描述
控制台打印结果:
内容较多所以只展示出控制台尾部截图
·这里我们先来了解一下Selenium

Selenium 是一套完整的web应用程序测试系统,可以模拟真实浏览器,自动化测试工具。Selenium框架底层使用JavaScript模拟真实用户对浏览器进行操作,可以返回任何形式的动态数据,在使用Selenium的过程中也可以进行人为干预,即:设置程序代码来操控它。
Selenium的强大之处是:使用Selenium访问网页是通过建立一个模拟浏览器,测试代码执行时,该浏览器自动按照指令代码做出点击、输入、打开、验证、登陆等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。所以各大网站的反爬虫机制对Selenium都没有限制机制。

·回到最开始的问题————展开阅读全文

在了解到Selenium的功能后,我们应该开始思考:当我们想要查看全部文章内容时都需要进行二次点击展开网页隐藏的内容,那么使用Selenium来进行模拟操作时,是否也需要?
回答是:ofcourse!

下面展示一张HTML代码截图:

其中蓝色标记的HTML代码对应着我准备爬取的文章数据。

HTML代码:超文本标记语言(标准通用标记语言下的一个应用,外语缩写HTML),是迄今为止网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。

我们需要知道:HTML代码是根据浏览器进程实时变化的,上图展示的HTML代码是我还没有点击“展开阅读全文”时所得到的HTML代码。

下面再继续展示一张HTMl代码截图:
在这里插入图片描述
第二张图片是我展开全文后对应相同数据位置的HTML代码内容,我们可以发现一个细微的变化。
style= "height: 370px; overflow: hidden;"只出现在第一张图。
于是我可以推测出:style内容使文章数据被隐藏起来了。

·认识style字段中的两个元素——height、overflow
overflow:主要用于设置盒子的属性,规定当内容溢出元素框时发生的事情。
overflow从字面意义上来讲就是溢出的意思。换句话说:你有一个高为20cm的盒子,而盒子内将要存放的文件夹的高度要比盒子的实际高度大,overflow就是针对这种情况进行处理。
height是设置盒子高度。

和overflow属性相似的还有display属性、visibility属性,这三种属性也被用来隐藏部分数据,不同网站的HTML代码中用于隐藏数据的属性和值都不一定相同,所以还要求我们针对不同的属性作出不同的反应。
下面简单的介绍这三种属性主要、常见的值。

overflow属性:

visible:默认值,内容不会被剪切,内容会溢出显示在元素框之外。
hidden:内容会被剪切,溢出于元素框的内容不可见。
scroll:内容会溢出被你剪切,但会自动生成滚动条。
auto:内容如果溢出, 会自动生成滚动条。
inherit:继承父级的overflow值。

display属性:

none:表示此元素不会被显示。
block:该属性会把元素转换为块级元素,此元素前后会带有换行符,因此就可以设置元素的宽高和上下的margin和padding。
inline:此元素会被显示为内联元素,元素前后没有换行符,即display:inline的作用即可以将一个块级元素转换成行内元素,那么这个块级元素将不能再设置宽和高以及上下方向的margin和padding。

visibility属性:

visible:默认值,元素是可见的。
hidden:元素是不可见的。
collapse:当在表格元素中使用时,此值可删除一行或一列,但是它不会影响表格的布局。被行或列占据的空间会留给其他内容使用。如果此值被用在其他的元素上,会呈现为 "hidden"。
inherit:规定应该从父元素继承 visibility 属性的值。

上面示例的HTML代码中,overflow的值是hidden——内容被剪切,溢出元素框的内容不可见。
overflow值导致部分溢出数据被隐藏,而这些数据是我们无法直接获得的,所以在使用Selenium爬取被隐藏数据时,我们需要在脚本代码中将overflow的值修改,使其隐藏的数据为可见。

上文有说明Selenium是通过JavaScript(简称“JS”)来建立一个模拟浏览器执行指令代码的。

JavaScript基本特点:
·JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
·主要用来向HTML页面添加交互行为。

JavaScript编程原理:
·JavaScript是一种脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器由浏览器解释运行。

所以我们要想让Selenium能够获取到隐藏元素,就需要重新设置HTML标签,即重设置JS文本中的脚本代码。

代码如下:
在这里插入图片描述

JS中的document是重设置JS脚本代码的函数,这里使用getElementById先定位到所需数据的代码标签,然后选择该标签内的style字段,修改overflow的值为visible。
再使用webdriver对象的execute_script()方法选择我们设置的JS变量。

此时再次执行该过程就能成功获得全文内容了。
在这里插入图片描述

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值