说明
- 之前的爬虫全部都是那种获取静态网页的数据,但是很多时候数据是由 JavaScript 返回的,想用 Python 获取网站中 JavaScript 返回的数据就需要模拟浏览器了。
- 还有一些反爬虫网站,用之前的办法都解决不了,我们就可以搬出这个模块了,这个模块模拟的浏览器原理上和我们平时用的浏览器完全没有区别。
安装
- 之前的安装都只需要 pip 或者 conda 以下就好了,这个有一丢丢麻烦。首先还是要 pip install 一下 selenium,然后还需要安装一个浏览器插件。
- 之前看书上用的 PhantomJS,结果运行发现已经不支持了。所以建议去找一下 Chrome driver,这是一个 exe 文件,将其放到 python 搜索路径里面去。
- 除了 Chrome driver,电脑必须安装对应版本的 Chrome 浏览器,一定是对应版本嗷,所以全部更新到最新版本就 OK 了。
- 用下面的代码可以验证是否安装布置成功:
from selenium import webdriver
driver = webdriver.Chrome()
初步尝试
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(5)
browser.find_element_by_id("su").click()
time.sleep(5)
browser.quit()
- 上面的 time.sleep 就是等待一段时间,而且是在加载完成以后等待。
- 中间那个 click 就是交换点击了搜索按钮,有了这个神器,我们即使不能高速搜索并存储,但是要存一个网页的指定东西就很简单了(但是要注意合法哦)
- 如果使用 debug 把程序停下来,你会发现更有趣的事情:程序里面的 driver 和 python 打开的浏览器是绑定的,如果你暂停程序,改变浏览器,程序里的数据就会跟着变化。
关于解析器
- 在上面那个例子里面我们已经看到了,selenium 里面由自己的选择器,而且我们必须学会掌握,因为有时候我们需要去操作填入信息。
- 解析器分类如下所示,其中 element 表示只返回第一个,可以改成 elements ,就返回列表。
根据某个属性查找
find_element_by_id() # id 属性
find_element_by_name() # name 属性
find_element_by_class_name() # class 属性
find_element_by_tag_name() # 指标签名,如 div
- 为什么是这几个属性?因为这些属性基本是可以唯一确定组件的,尤其是那些 input 的标签。
获取链接的两个方法
find_element_by_link_text() # 根据文字查链接标签
find_element_by_partial_link_text() # 只需输入文字一部分即可
两个老朋友
find_element_by_css_selector()
find_element_by_xpath()
- 没错,是支持 css 和 xpath 的,但是尽量不要用,因为效率比较低。
获取 element 的值
- 和以前一样,我们比较关注怎么把 element 里面的信息挖出来,所以以下的函数和属性是我们最关注的(pycharm 有提示,一看就懂):
| 属性 / 方法 |
说明 |
| get_attribute(name) |
获取某个属性值 |
| text |
内容值 |
| tag_name |
标签名称 |
| id |
id 值 |
| parent |
父节点 |
- 另外 driver 还有一个重要的属性,page_source ,用于获得网页 html 代码(字符串)
浏览器操作
- 关于浏览器就以下几个操作,就和人手操作一样,想想平时是怎么控制的,就很明白了
browser = webdriver.Chrome()
browser.get('https://cn.bing.com/')
# 最大化
browser.maximize_window()
# 最小化
browser.minimize_window()
# 设置长宽
browser.set_window_size(width, height)
# 设置位置及长宽
# 屏幕左上角为原点,向右为 x 轴,向下为 y 轴
browser.set_window_rect(x, y, width, height)
# 刷新页面
browser.refresh()
# 关闭当前页面
browser.close()
# 关闭所有页面
browser.quit()
# 前进
browser.forward()
# 后退
browser.back()
element 最常见操作
- 得到 element 以后,就有下面四个最简单的操作函数:
| 函数 |
说明 |
| click() |
左键单击 |
| submit() |
提交表单 |
| send_keys(words) |
向 input 中输入文字 |
| clear() |
清除 input 中的文字 |
- 这里 click() 和 submit() 有点重复,但是上网搜了一圈,有人说有时候不行,换一个就好了,是个玄学问题。所以,一般就 click() 就好,不行了换 submit() 试一下。
键盘按键
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id("user_name").send_keys(Keys.TAB)
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
# 右键
ActionChains(driver).context_click(element).perform()
# 双击
ActionChains(driver).double_click(element).perform()
# 拖动
ActionChains(driver).drag_and_drop(element, target).perform()
控制网页向下滚动
- 有时候我们需要将网页向下滚才能动态加载出内容,这个时候我们就需要知道如何使网页向下滚动。
- 方法是调用 js 方法,我们无需了解很深,就是下面这一句话:
driver.execute_script('document.documentElement.scrollTop=50')
本文章使用limfx的vsocde插件快速发布