Python使用Selenium Webdriver爬取网页所有内容

news/2024/11/7 23:55:44/

Python使用Selenium Webdriver爬取网页所有内容

  • 一、为什么我抓不到网页的全部html内容
  • 二、Selenium的基本使用
  • 三、使用Selenium抓取全部HTML

一、为什么我抓不到网页的全部html内容

有时候,我们在用urllib或者requests库抓取页面时,得到的html源代码和浏览器中看到的不一样。这将是我们面临的一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码可能就是一个空壳,例如:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>this is a demo</title></head><body><div id="container"></div></body><script src="app.js"></script></html>

body节点里面只有一个id为container的节点,但是需要注意在body节点后引入了app.js, 它便负责整个网站的渲染。

在浏览器中打开这个页面时,首先会加载这个HTML内容,接着浏览器会发现其中引入了一个app.js文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的JavaScript代码,而JavaScript则会改变HTML中的节点,向其中添加内容,最后得到完整的页面。

但是在用urllib或者requests等库请求当前页面时,我们得到的只是这个HTML代码,它不会帮助我们去继续加载这个JavaScript文件,这样也就看不到浏览器中的内容了。

而且,JavaScript动态渲染的页面可不止Ajax这一种,还有其他各种原因会导致我们得到的源代码和浏览器中看到的不一样。

对于抓不到全部html内容的情况,我们能采取什么应对措施呢,本文介绍一种可行的方法,就是通过Selenium webdriver来模拟浏览器运行的方式,这样就可以做到在浏览器中看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样,我们就不用再去管网页内部的JavaScript用了什么算法渲染页面,也不用管网页后台的Ajax接口到底有哪些参数。所有的这些,都交给Selenium webdriver来帮我们完成。

二、Selenium的基本使用

Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。

Selenium webdriver的安装和基本使用方法,可以参考另一篇文章。
Python使用Selenium WebDriver的入门介绍及安装教程

Selenium的官方网站:
Selenium WebDriver

一些基本的用法,此处不再赘述。

三、使用Selenium抓取全部HTML

先看使用requests库直接提取到的代码,可以发现并不是完整的:

20221214220011

使用Selenium拿到的html代码,可以看到已经可以通过src属性提取到图片的url:

20221214220124

示例代码如下,详细的解读可以参考每一步的注释:

from selenium.webdriver import Firefox, FirefoxOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Byclass ContentPageParser():def __init__(self, content_page_url) -> None:self.content_url = content_page_url # 抓取content_page_url页面上全部的图片urlself.img_src = []                   # 保存当前页面上所有的图片urldef visit_content_page_with_firefox(self):option = FirefoxOptions()# 设置浏览器为无头模式,使用过程中不会弹出浏览器页面option.headless = Trueself.driver = Firefox(options=option)try:# 打开待抓取的url页面self.driver.get(self.content_url)# 设置灵活等待,最长等待10s,轮询间隔为1swait = WebDriverWait(self.driver, timeout=10, poll_frequency=1)# 使用css选择器进行元素定位,直到元素可见为止wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'img[class="showimg"]')))# 使用css选择器查找所有元素imgs = self.driver.find_elements(By.CSS_SELECTOR, 'img[class="showimg"]')# 提取所有图片的urlfor img in imgs:self.img_src.append(img.get_attribute('src'))except Exception as e:print(repr(e))finally:# 关闭webdriverself.driver.close() def get_img_src(self):return self.img_srcif __name__ == '__main__':content_parser = ContentPageParser('https://xxx/content_48495.html')content_parser.visit_content_page_with_firefox()img = content_parser.get_img_src()print(img)

http://www.ppmy.cn/news/3593.html

相关文章

Sysmac Studio使用Tortoise和Git实现版本控制

Sysmac Studio使用Tortoise和Git实现版本控制 实验时间:2022/11/16 实验软件:Sysmac Studio(1.52,需要软件授权支持版本控制)、Git(2.38.1)、Tortoise(2.13.0)、gitee(代码仓库) 实验目的:Sysmac Studio实现版本控制、多人同时开发(需要有Git和tortoris使用基础) 实验…

endo BCN-PEG4-COOH,1881221-47-1,endo BCN-四聚乙二醇-羧酸特点分享

●外观以及性质&#xff1a; endo BCN-PEG4-acid含有BCN基团和羧酸基团&#xff0c;酸基团可以在偶联条件下与胺反应形成酰胺键。BCN基团可以发生点击化学反应。 【产品理化指标】&#xff1a; ●中文名&#xff1a;endo BCN-四聚乙二醇-羧酸 ●英文名&#xff1a;endo BCN-P…

C语言文件操作(1)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录什么是文件程序文件数据文件文件名文件类型文件缓冲区文件指针什么是文件 磁盘的文件是文件 但在程序设计中&#xff0c;我…

特征融合与灰色回归的滚动轴承性能退化评估

摘要 针对传统退化指标无法准确反映滚动轴承全寿命周期内退化状态的问题,提出一种特征融合与灰色回归的滚动轴承性能退化评估方法.该方法提取滚动轴承振动信号的高维退化特征,构建基于单调性、相关性和鲁棒性的综合评价准则,选择有效退化特征并构建敏感指标集;提出核独立成…

在JMeter中如何设置参数化数据?

今天我们来做一个实例,看下在 JMeter 中,如何合理地设置参数化数据。 正式场景前的基准测试 在没有做业务混合场景之前,我们需要先做 Benchmark 测试,来确定一个登录业务能支持多少的业务量,这样就可以在业务混合场景中,根据场景中各业务的比例来确定登录的数据需要多少…

【华为机试真题详解】投篮大赛【2022 Q4 | 100分】

文章目录 前言题目描述示例 1题目解析参考代码前言 《华为机试真题详解 Python实现》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)…

SpringBoot打的jar包瘦身

文章目录正常打包瘦身方法一&#xff1a;Dloader.path指定依赖包位置瘦身方法二&#xff1a;配置文件里指定依赖包位置正常打包 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plu…

【大一大二必看】计算机专业的同学应该参加哪些比赛?

文章目录1. 前言2. ICPC3. CCPC4. 蓝桥杯5. 天梯赛6. CCF CSP7. PAT8. 全国高校计算机能力挑战赛9. 其他&#x1f351; 天池大赛&#x1f351; 华为软件精英挑战赛&#x1f351; LeetCode 周赛 / 双周赛&#x1f351; CSDN 编程竞赛总结1. 前言 2022 年已经过半&#xff0c;对…