selenium
- 概念:
- Selenium 是一个 Web 应用的自动化框架
- 自动化:通过它,我们可以写出自动化程序,像人一样在浏览器里操作web界面。 比如点击界面按钮,在文本框中输入文字 等操作,还能从web界面获取信息。 比如获取12306票务信息,招聘网站职位信息,财经网站股票价格信息 ,以及滑动模块验证码滑动等等,然后用程序进行分析处理。
- Selenium 的自动化原理
- selenium的安装
- pip install selenium
- 安装浏览器驱动
- 浏览器驱动 是和 浏览器对应的,不同的浏览器 需要选择不同的浏览器驱动目前主流的浏览器中, Chrome 浏览器对Selenium自动化的支持更加成熟一些。
我们就以Chrome浏览器为例下载url如下:
- https://chromedriver.storage.googleapis.com/index.html
- 比如:当前Chrome浏览器版本是72, 通常就需要下载72开头的目录里面的驱动程序 。- 注意:驱动和浏览器的版本号越接近越好,但是略有差别(比如72和73),通常也没有什么问题.
- 比如,解压到 d:\webdrivers 目录下面,也就是保证我们的Chrome浏览器驱动路径为 d:\webdrivers\chromedriver.exe
# -*- coding: utf-8 -*-
from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.baidu.com')
如果我们直接把驱动程序放到python安装目录下就不需要指定驱动路径了
selenium和爬虫之间的关联
1,便捷的捕获到任意形式的动态加载数据(可见即可得)
- 2,实现模拟登录jd
- 标签定位使用xpath表达式进行定位,也可使用css(根据id,class等进行定位)
- 标签定位使用xpath表达式进行定位,也可使用css(根据id,class等进行定位)
# -*- coding: utf-8 -*-
from selenium import webdriver
wd = webdriver.Chrome()# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd.get('https://www.jd.com')# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
search = wd.find_element_by_xpath('//*[@id="key"]') #定位到搜索框
search.send_keys('macbook pro') # 模拟输入搜索的内容
btn = wd.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()#模拟点击搜索按钮
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
wd = webdriver.Chrome()# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd.get('https://www.jd.com')# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.implicitly_wait(5) #静默等待最大5秒,保证页面加载完毕
search = wd.find_element_by_xpath('//*[@id="key"]') #定位到搜索框
search.send_keys('macbook pro') # 模拟输入搜索的内容
btn = wd.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()#模拟点击搜索按钮
time.sleep(2)#等待2秒执行下面操作
#在搜索结果页面进行滚轮向下滑动的操作(执行js操作:js注入)
wd.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2) #为了看见滑动效果我们可以等待2秒
wd.quit()#关闭浏览器
爬虫展示
3 使用selenium爬取jd商城数据(该案例翻页效果失败)
- 仔细分析京东的页面后发现,京东的页面是分两段动态生成的,先显示一半的结果,当你下拉页面后,再显示后一半的结果
- 每次下拉一半时,都会生成一个新的s_new.php?..,同时请注意请求参数中的 page 数的变化情况
- 由此可以得出,网页中的一页,实际上是 2 个 page 组成的,那么出现这样的错误就可以解释了
- 当刚刚加载出页面时,此时页面中只有 page: 1,而整个页面框架也刚刚加载出来,所以此时的页面跳转模块在page:1的下面,而当selenium选择页面跳转模块时,页面就已经滚动到下方了,于是Ajax又动态加载了page: 2,页面因此发生了改变,所以原先选择的元素就失效了
-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 键盘按键操作库
import time
# 1,模拟用户访问网址
def spider(url,keyword):
driver = webdriver.Chrome()# 定义浏览器
driver.get(url)
driver.maximize_window() # 窗口最大化
driver.implicitly_wait