【Python】Python3网络爬虫实战-37、动态渲染页面抓取:Selenium

在前面一章我们了解了 Ajax 的分析和抓取方式,这种页面其实也是 JavaScript 动态渲染的页面的一种情形,通过直接分析 Ajax 我们仍然可以借助于 Requests 或 Urllib 来实现数据的抓取。

不过 JavaScript 动态渲染的页面不止 Ajax 这一种。比如中国青年网:http://news.youth.cn/gn/,它的分页部分是由 JavaScript 生成的,并非原始 HTML 代码,这其中并不包含 Ajax 请求。如 ECharts 的官方实例:http://echarts.baidu.com/demo…,其图形都是经过 JavaScript 计算之后生成的。再有淘宝这种页面,它即使是 Ajax 获取的数据,但是其 Ajax 接口含有很多加密参数,我们难以直接找出其规律,也很难直接分析 Ajax 来抓取。

但是数据总归是要抓取的,为了解决这些问题,我们可以直接使用模拟浏览器运行的方式来实现,这样我们就可以做到浏览器看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面,不用管网页后台的 Ajax 接口到底有哪些参数,利用模拟浏览器的方式我们都可以直接获取 JavaScript 渲染的最终结果,只要能在浏览器中看到,我们都能抓取。

在 Python 中提供了许多模拟浏览器运行的库,如 Selenium、Splash、PyV8、Ghost 等等,本章我们介绍一下其中 Selenium 和 Splash 的用法,有了它们,我们就不用再为动态渲染的页面发愁了。

Selenium的使用

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

1. 准备工作

本节以 Chrome 为例来讲解 Selenium 的用法,在本节开始之前请确保已经正确安装好了 Chrome 浏览器并配置好了 ChromeDriver,另外还需要正确安装好 Python 的 Selenium 库,详细的过程可以参考第一章的安装和配置说明。

2. 基本使用

准备工作做好之后,首先我们来大体看一下 Selenium 有一些怎样的功能,先用一段实例代码来感受一下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input = browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser, 10)
    wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

运行代码之后可以发现会自动弹出一个 Chrome 浏览器,浏览器首先会跳转到百度,然后在搜索框中输入 Python 进行搜索,然后跳转到搜索结果页,等待搜索结果加载出来之后,控制台分别会输出当前的 URL,当前的 Cookies 还有网页源代码,如图 7-1 所示:

图 7-1 运行结果
在jon g zhi tai可以看到我们得到的当前的 URL、Cookies、源代码都是浏览器中的真实内容。
所以说,如果我们用 Selenium 来驱动浏览器加载网页的话,我们就可以直接拿到 JavaScript 渲染的结果了,不管是什么加密统统不用再需要担心。
下面我们来详细了解一下Selenium的用法。

3. 声明浏览器对象

Selenium 支持非常多的浏览器,如 Chrome、Firefox、Edge 等,还有手机端的浏览器 Android、BlackBerry 等,另外无界面浏览器 PhantomJS 也同样支持。
我们可以用如下的方式初始化:

from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

这样我们就完成了浏览器对象的初始化并赋值为 browser 对象,接下来我们要做的就是调用 browser 对象,让其执行各个动作,就可以模拟浏览器操作了。

3. 访问页面

我们可以用 get() 方法来请求一个网页,参数传入链接 URL 即可,比如在这里我们用 get() 方法访问淘宝,然后打印出源代码,代码如下:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()

运行之后我们便发现弹出了 Chrome 浏览器,自动访问了淘宝,然后控制台输出了淘宝页面的源代码,随后浏览器关闭。
通过这几行简单的代码我们便可以实现浏览器的驱动并获取网页源码,非常便捷。

4. 查找节点

Selenium 可以驱动浏览器完成各种操作,比如填充表单、模拟点击等等,比如我们想要完成向某个输入框输入文字的操作,总得需要知道这个输入框在哪里吧?所以 Selenium 提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便于下一步执行一些动作或者提取信息。

单个节点

比如我们想要从淘宝页面中提取搜索框这个节点,首先观察它的源代码,如图 7-2 所示:

图 7-2 源代码
可以发现它的 ID 是 q,Name 也是 q,还有许多其他属性,那我们获取它的方式就有多种形式了,比如find_element_by_name() 是根据 Name 值获取,ind_element_by_id() 是根据 ID 获取,另外还有根据XPath、CSS Selector 等获取的方式。
我们用代码实现一下:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first, input_second, input_third)
browser.close()

在这里我们使用了三种方式获取输入框,根据 ID、CSS

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值