Python爬虫进阶(一)——爬虫之动态数据与selenium

从这一章开始,咱们将探讨爬虫的进阶部分,难度比起之前的初级也是有所提升。

一、动态HTML技术
二、Selenium+chromedriver介绍
三、Selenium获取动态数据基本操作

一、动态HTML技术

1.动态HTML技术了解

这是几种动态页面技术

1.1 JS

它是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页。

1.2 jQuery

jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码。

1.3 ajax

ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新

2.如何获取ajax数据

(1)直接分析ajax调用的接口,然后通过代码请求这个接口。

(2)使用Selenium+chromedriver模拟浏览器行为获取数据。

这是两种方法的对比:

方式 优点 缺点
分析接口 直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
selenium 直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。 代码量多。性能低。

selenium能够模拟浏览器的行为,进行一系列的操作。相比之下更为容易。

二、Selenium+chromedriver介绍

1.Selenium

selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面获取需要的数据,甚至页面截屏。

chromedriver是一个驱动Chrome浏览器的驱动程序,使用它才可以驱动浏览器。当然针对不同的浏览器有不同的driver。

以下列出了不同浏览器及其对应的driver
Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads

Firefox:https://github.com/mozilla/geckodriver/releases

Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

2.chromedriver

咱们需要下载chromedriver

下载地址:https://www.cnblogs.com/JHblogs/p/7699951.html

安装总结:https://www.jianshu.com/p/a383e8970135

3.安装Selenium和chromedriver

安装Selenium

pip install selenium

安装chromedriver:下载完成后,放到不需要权限的纯英文目录下就可以了。

三、Selenium获取动态数据基本操作

1.基本过程

from selenium import webdriver
from selenium.webdriver.common.by import By

# 实例化浏览器
driver = webdriver.Chrome()

# 发送请求
driver.get('https://www.baidu.com')

# 窗口最大化
driver.maximize_window()

# 退出当前窗口
driver.close()

# 退出浏览器
driver.quit()

跟之前的原理差别不大,也是先赋予一个selenium对象,再对对象进行一系列的操作,获取到自己想要的数据。

2.定位元素

find_element_by_id:是根据id来查找某个元素。

# 方法1
submitTag = driver.find_element_by_id('su')
# 方法2
submitTag1 = driver.find_element(By.ID,'su')

find_element_by_class_name:根据类名查找元素。

# 方法1
submitTag = driver.find_element_by_class_name('su')
# 方法2
submitTag1 = driver.find_element(By.CLASS_NAME,'su')

find_element_by_name:根据name属性的值来查找元素。

# 方法1
submitTag = driver.find_element_by_name('email')
# 方法2
submitTag1 = driver.find_element(By.NAME,'email')

find_element_by_tag_name:根据标签名来查找元素。

# 方法1
submitTag = driver.find_element_by_tag_name('div')
# 方法2
submitTag1 = driver.find_element(By.TAG_NAME,'div')

find_element_by_xpath:根据xpath语法来获取元素。

# 方法1
submitTag = driver.find_element_by_xpath('//div')
# 方法2
submitTag1 = driver.find_element(By.XPATH,'//div')

find_element_by_css_selector:根据css选择器选择元素。

# 方法1
submitTag = driver.find_element_by_css_selector('//div')
# 方法2
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')

需要注意的是,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。

3.操作表单元素

操作输入框:分为两步。
第一步:找到这个元素。
第二步:使用send_keys(value),将数据填充进去。

以百度页面搜索框为例,实现页面搜索操作
Python爬虫进阶(一)——爬虫之动态数据与selenium_第1张图片
可以发现搜索框id为"kw",属性为input,搜索关键词”python“,代码如下:

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')

结果如下,实现了简单的浏览器操作。
Python爬虫进阶(一)——爬虫之动态数据与selenium_第2张图片
使用clear方法,可以清除输入框中的内容

inputTag.clear()

操作checkbox:因为要选中checkbox标签,在网页中是通过鼠标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件

rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()

操作按钮:操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了。

inputTag = driver.find_element_by_id('su')
inputTag.click()

选择select:select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。

4.鼠标行为链

有时候在页面中的操作可能要有很多步,那么这时候就可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件
这部分代码如下:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')
# 定位到输入框
inputTag = driver.find_element_by_id('kw')

# 定位到百度一下按钮
submitBtn = driver.find_element_by_id('su')

# 实例化对象
actions = ActionChains(driver)

# 把鼠标移动到输入框中
actions.move_to_element(inputTag)

# 输入内容
actions.send_keys_to_element(inputTag,'python')

actions.move_to_element(submitBtn)

actions.click()

# 右键
actions.context_click()

# 提交行为链上的操作
actions.perform()

这部分结果如下
Python爬虫进阶(一)——爬虫之动态数据与selenium_第3张图片
还有更多的鼠标相关的操作

click_and_hold(element):点击但不松开鼠标
context_click(element):右键点击
double_click(element):双击

更多方法请参考:http://selenium-python.readthedocs.io/api.html

5.页面等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。还有一种便是咱们熟知的强制等待

先来说说强制等待(2秒)

from selenium import webdriver
import time   # 导入时间模块

driver = webdriver.Chrome()

driver.get('https://www.baidu.com/')

# 强制等待
time.sleep(2)

隐式等待5秒

# 隐式等待
driver.implicitly_wait(5)

显式等待

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
 )
finally:
    driver.quit()

6.打开多窗口和切换页面

有时候我们会有打开多个窗口的需求,这里就跟大家介绍一下,以同时打开百度和豆瓣为例。

from selenium import webdriver

driver = webdriver.Chrome()

# 打开百度
driver.get('https://www.baidu.com/') 

# 同时打开豆瓣窗口
driver.execute_script('window.open("https://www.douban.com/")')

现在,我们试着输入关键字python,看看是哪个窗口在运行,并打印当前的url地址。

driver.find_element_by_id('kw').send_keys('python')

print(driver.current_url)

结果如下:
Python爬虫进阶(一)——爬虫之动态数据与selenium_第4张图片
在这里插入图片描述
可以看到,当前的url是百度的url。目前打开了多窗口,下面是如何实现切换窗口,并打印切换后的窗口。

# 索引值是从0开始,第一个网页的索引值是0,以此类推,现在切换到第二个
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)

结果如下
Python爬虫进阶(一)——爬虫之动态数据与selenium_第5张图片
在这里插入图片描述
可以发现,咱们已经成功做到了打开多窗口和切换页面

好了,selenium部分到这里就介绍完毕了。大家可以试试其中的操作。

你可能感兴趣的:(python,爬虫,python,selenium)