从现在开始,你只需要安装并配置好 Python 和 Pycharm 就可以轻松完成这个自动赚钱项目,防止有同学懒得看 selenium 教程,在此我还要简单的介绍一下 selenium 的基本语法和使用。
selenium 是一个可以操控浏览器的库,这个库提供的 API 可以模拟人操作浏览器,也就是说 selenium 提供的 API 含有人操作浏览器的一系列行为,比如:点击,拖动,输入,最大化,拖动滚动条等等。
Python 并没有直接提供 selenium 库,所以,我们首先需要安装 selenium 库,目前最新的 selenium 版本不太稳定,我们可以使用稳定的版本,比如 3.141.0,安装方法如下:
pip install -i https://mirrors.aliyun.com/pypi/simple selenium==3.141.0
selenium 并不能直接操控浏览器,它还需要一个操控浏览器的驱动,因为 selenium 并不能直接认识浏览器,他需要一个中介,也就是说selenium是通过各种不同浏览器提供的驱动来操控不同的浏览器。
针对不同的浏览器,我们可以下载不同的驱动,以下是各个浏览器的驱动网址:
在此,我们使用 Chrome 浏览器,所以只需要下载 Chrome 浏览器的驱动:chromedriver。
我们在此使用 Chrome 浏览器,所以我们先把 Chrome 浏览器的驱动下载到本地,然后我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的 Chrome 浏览器驱动文件放在该目录下。
下面,我们来用程序验证 Chrome 浏览器驱动是否可以正常使用,执行以下代码,如果能直接打开 Chrome 浏览器,说明我们已经把 Chrome 驱动安装配置成功。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") # 使用 selenium 通过 Chrome 驱动打开 Chrome 浏览器
上面的代码只是打开浏览器,浏览器并没有打开任何网站,只是呈现出一个空白的网页,如果我们想通过浏览器打开某个特定的网站该怎么办呢,比如我们想打开百度网站,代码如下:
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get('http://www.baidu.com') # 操控浏览器打开百度主页 print(driver.page_source)
我们前面刚刚提过,selenium 可以模拟人对浏览器的所有操作,下面我们就来学习一下常见的操控浏览器的行为。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get('http://www.baidu.com') # 操控浏览器打开百度主页 print(driver.page_source)
实际上我们用程序操作浏览器和人操作浏览器是一样的,比如我们想点击一个控件,就需要这个控件露出来,否则我们没法点击。同样,我们用 selenium 操控浏览器点击一个按钮也是一样的,所以我们要经常改变浏览器的大小让控件漏出来。
我们调用 set_window_size 函数可以改变浏览器的大小,只需要传入宽和高两个参数即可调整浏览器大小。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.com") driver.set_window_size(480, 800) # 设置浏览器宽 480 像素、高 800 像素
让浏览器最大化也是常见的需求,我们只需要调用 maximize_window 函数即可以使浏览器最大化。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.com") driver.maximize_window() # 最大化浏览器
大家仔细思考一下,我们用 selenium 操控浏览器是什么意思,其实就是用 selenium 模拟人上网,也就是说人用浏览器能做的任何事情,我们用 selenium 都可以做,selenium 就如一个会上网的机器人一样。
刚刚我们只是简单的学习了用 selenium 打开浏览器并做了对浏览器做了一些简单的操作,大家要知道,我们上网更重要的是对网页做操作,也就是对网页中的控件做操作,想对这些控件做操作,首先,我们就需要先找到它们。
Selenium 提供了 8 种定位方式: id,name,class name,tag name,link text,partial link text,xpath,css selector。
这 8 种定位方式在 Python selenium 中所对应的方法为:
我们发现除了根据 id 定位之外,剩下的 7 中方法都提供两个函数,两个函数唯一的区别是在单词 element 后面多了一个 s 表示复数,带 s 的函数是定位一组元素的写法(也就是找到符合条件的所有元素,结果为一个数组),如果不加 s,则是找到第一个符合条件的元素。而网页中元素的 id 是唯一的(当然如果你非要多个元素同用一个 id 名,只有第一个元素的 id 有效),所以没有 find_elements_by_id 这种查找方法。
我们了解了定位规则,现在就让我们开始搞个栗子吧,我们打开百度主页面,通过前端工具(按 F12)查看到一个元素的属性是这样的,我们现在使用以上 8 种方法去查找元素,我们用单一元素定位的函数,对于一组元素定位的函数使用,大家自行写代码做实验。
<form name="f" id="form" action="/s" class="fm has-soutu" onsubmit="javascript:F.call('ps/sug','pssubmit');"> <span id="s_kw_wrap" class="bg s_ipt_wr new-pmd quickdelete-wrap"> <span class="soutu-btn"></span> <input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"> <i class="c-icon quickdelete c-color-gray2" title="清空"></i> <i class="quickdelete-line"></i> <span class="soutu-hover-tip" style="display: none;">按图片搜索</span> </span> ...... </form>
现在就让我们定位 input 标签的输入框,下面我们列举了两种定位函数,一种是最直接的方式,另一种是使用 xpath 语法。
driver.find_element_by_id("kw") # 通过 id 定位 driver.find_element_by_name("wd") # 通过 name 定位 driver.find_element_by_class_name("s_ipt") # 通过class name定位 driver.find_element_by_tag_name("input") # 通过tag name定位
通过 xpath 定位,xpath 定位有 N 种写法,这里列几个常用写法。
driver.find_element_by_id("kw") # 通过 id 定位 driver.find_element_by_name("wd") # 通过 name 定位 driver.find_element_by_class_name("s_ipt") # 通过class name定位 driver.find_element_by_tag_name("input") # 通过tag name定位
我们已经学习了定位元素,定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框),下面就来认识 WebDriver 中最常用的几个方法,在 WebDriver 中,将这些关于鼠标操作的方法封装在 ActionChains 类提供,ActionChains 类提供了鼠标操作的常用方法:
我们给大家举例鼠标悬停操作如果写代码,其它的操作行为,大家可以自行试验,多动动手对自己的编码能力提高有很大的帮助。
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains # 导入提供鼠标操作的 ActionChains 类。 driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.cn") driver.maximize_window() # 最大化浏览器为了把设置标签露出来,否则无法移动到那儿 above = driver.find_element_by_id("s-usersetting-top") ''' 对定位到的元素执行鼠标悬停操作 1.调用 ActionChains()类: 将浏览器驱动 driver 作为参数传入。 2.move_to_element(above):将要移动鼠标到这个 above 这个元素上 3.perform:执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作。 ''' ActionChains(driver).move_to_element(above).perform()
我们上网时操作浏览器,不但有鼠标操作,键盘操作也是必不可少的,比如我们在百度搜索框内搜索某个信息,就输入用键盘输入。selenium 只需要用一个 send_keys 函数就可以模拟键盘把我们想输入的内容输入到浏览器中,比如我们在百度搜索框内输入 selenium。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") # 模拟键盘输入
鼠标操作还有单击,双击,右键等等行为,现在我们就结合键盘的输入和鼠标点击行为,使用键盘操作在百度搜索框内输入我们想搜索的内容,然后使用鼠标操作点击百度一下按钮,来实现自动搜索行为。
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") # 模拟按键输入 driver.find_element_by_id("su").click() # 单击元素
虽然 WebDriver 提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助 JavaScript 来控制浏览器的滚动条。WebDriver 提供了execute_script 函数来执行 JavaScript 代码。window.scrollTo 函数用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:
from selenium import webdriver driver = webdriver.Chrome(executable_path="c:/driver/chromedriver.exe") driver.get("http://www.baidu.com") driver.set_window_size(600, 600) js = "window.scrollTo(150,100);" # 通过javascript设置浏览器窗口的滚动条位置 driver.execute_script(js) # 执行 js 代码
目前为止,我们已经把 selenium 常用的功能都介绍了,掌握了上面这些就可以开始我们的赚钱项目了。