Python 培训(爬虫)Selenium模拟浏览器

说明

  • 之前的爬虫全部都是那种获取静态网页的数据,但是很多时候数据是由 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')
  • 这里面的 50 就是向下滚动的距离。

本文章使用limfx的vsocde插件快速发布