第十五天:Selenium与PhantomJS

文章目录

一、Selenium

二、PhantomJS

三、使用方式

1.简单例子

四、页面操作

1.页面交互

1)获取获取)

2)输入内容输入内容)

3)模拟点击某个按键模拟点击某个按键)

4)清空文本清空文本)

5)元素拖拽元素拖拽)

6)历史记录历史记录)

五、API

六、等待

[1. 隐式等待](#1. 隐式等待)

[2. 显示等待](#2. 显示等待)

[3. 强制等待](#3. 强制等待)

一、Selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

PyPI网站下载 Selenium库https://pypi.python.org/simple/selenium,也可以用 第三方管理器

pip用命令安装:pip install selenium

Selenium 官方参考文档:http://selenium-python.readthedocs.io/index.html

二、PhantomJS

PhantomJS 是一个基于Webkit的"无界面"(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效

如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情

  1. 注意:PhantomJS(python2)

只能从它的官方网站http://phantomjs.org/download.html) 下载。 因为 PhantomJS 是一个功能完善(虽然无界面)的浏览器而非一个 Python 库,所以它不需要像 Python 的其他库一样安装,但我们可以通过Selenium调用PhantomJS来直接使用。

PhantomJS 官方参考文档:http://phantomjs.org/documentation

  1. python3使用的浏览器

随着Python3的普及,Selenium3也跟上了行程。而Selenium3最大的变化是去掉了Selenium RC,另外就是Webdriver从各自浏览器中脱离,必须单独下载

  1. 安装Firefox geckodriver

安装firefox最新版本,添加Firefox可执行程序到系统环境变量。记得关闭firefox的自动更新

firefox下载地下:https://github.com/mozilla/geckodriver/releases

将下载的geckodriver.exe 放到path路径下 D:\Python\Python36\

  1. 安装ChromeDriver

http://chromedriver.storage.googleapis.com/index.html

注意版本号要对应

下载下来的文件解压到Python36\Scripts

chrome59版本以后可以变成无头的浏览器,加以下参数

复制代码
options = webdriver.ChromeOptions()
options.add_argument('--headless')
chrome = webdriver.Chrome(chrome_options=options)
chrome.get("http://ww.baidu.com")

代理模式

复制代码
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument("--proxy-server=http://61.138.33.20:808")
chrome = webdriver.Chrome(chrome_options=option)
chrome.get('http://httpbin.org/get')
info = chrome.page_source
​
print(info)

三、使用方式

Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫

1.简单例子

复制代码
# 导入 webdriver
from selenium import webdriver
​
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
​
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.PhantomJS()
​
# 如果没有在环境变量指定PhantomJS位置
# driver = webdriver.PhantomJS(executable_path="./phantomjs"))
​
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
​
# 获取页面名为 wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text
​
# 打印数据内容
print(data)
​
# 打印页面标题 "百度一下,你就知道"
print(driver.title)
​
# 生成当前页面快照并保存
driver.save_screenshot("baidu.png")
​
# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id("kw").send_keys("尚学堂")
​
# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()
​
# 获取新的页面快照
driver.save_screenshot("尚学.png")
​
# 打印网页渲染后的源代码
print(driver.page_source)
​
# 获取当前页面Cookie
print(driver.get_cookies())
​
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
​
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
​
# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("python爬虫")
​
# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)
​
# 清除输入框内容
driver.find_element_by_id("kw").clear()
​
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
​
# 获取当前url
print(driver.current_url)
​
# 关闭当前页面,如果只有一个页面,会关闭浏览器
# driver.close()
​
# 关闭浏览器
driver.quit()
# 浏览器退出Bug-解决方案
os.system('taskkill /im chromedriver.exe /F')
os.system('taskkill /im chrome.exe /F')

四、页面操作

1.页面交互

仅仅抓取页面没有多大卵用,我们真正要做的是做到和页面交互,比如点击,输入等等。那么前提就是要找到页面中的元素。WebDriver提供了各种方法来寻找元素。例如下面有一个表单输入框

复制代码
<input type="text" name="passwd" id="passwd-id" />

1)获取

复制代码
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_elements_by_tag_name("input")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")

注意:

文本必须完全匹配才可以,所以这并不是一个很好的匹配方式

在用 xpath 的时候还需要注意的如果有多个元素匹配了 xpath,它只会返回第一个匹配的元素。如果没有找到,那么会抛出 NoSuchElementException 的异常

2)输入内容

复制代码
element.send_keys("some text")

3)模拟点击某个按键

复制代码
element.send_keys("and some", Keys.ARROW_DOWN)

4)清空文本

复制代码
element.clear()

5)元素拖拽

要完成元素的拖拽,首先你需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现

复制代码
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
 
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

6)历史记录

操作页面的前进和后退功能

复制代码
driver.forward()
driver.back()

五、API

元素选取

  1. 单个元素选取

find_element_by_id

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

2)多个元素选取

find_elements_by_name

find_elements_by_xpath

find_elements_by_link_text

find_elements_by_partial_link_text

find_elements_by_tag_name

find_elements_by_class_name

find_elements_by_css_selector

3)利用 By 类来确定哪种选择方式

复制代码
from selenium.webdriver.common.by import By
 
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By 类的一些属性如下:

ID = "id"

XPATH = "xpath"

LINK_TEXT = "link text"

PARTIAL_LINK_TEXT = "partial link text"

NAME = "name"

TAG_NAME = "tag name"

CLASS_NAME = "class name"

CSS_SELECTOR = "css selector"

六、等待

1. 隐式等待

到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行。

复制代码
from selenium import webdriver
url = 'https://www.guazi.com/nj/buy/'
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(100)
print(driver.find_element_by_class_name('next'))
print(driver.page_source)

2. 显示等待

指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回

复制代码
url = 'https://www.guazi.com/nj/buy/'
    driver = webdriver.Chrome()
    driver.get(url)
    wait = WebDriverWait(driver,10)
    wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'next')))
    print(driver.page_source)

presence_of_element_located

元素加载出,传入定位元组,如(By.ID, 'p')

presence_of_all_elements_located

所有元素加载出

element_to_be_clickable

元素可点击

element_located_to_be_selected

元素可选择,传入定位元组

3. 强制等待

使用 time.sleep

相关推荐
数据智能老司机4 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机5 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
这里有鱼汤7 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook16 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室16 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三18 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试