我们每天都与浏览器打交道,甚至工作也与浏览器相关,从浏览器抓取、提取、提交信息,成了你的家常便饭。你每天不断的重复着做一件事,完全出于习惯,就像程序化的机器人一样,那为何不交给程序呢?

WebBrowser简介

我们先利用自带的webbrowser,它可以打开浏览器并获取指定页面。

1
2
import webbrowser 
webbrowser.open('https://bing.com/')

很简单,是不是?

我们再用它来完成一个稍微复杂点的动作,比如将一个地址通过命令行参数或者剪贴板,然后在 Google 地图上打开它。

首先,我们需要搞清楚网址是怎么构成的,比如在Google地图查找一下西湖。

1
https://www.google.com/maps/place/%E8%A5%BF%E6%B9%96/@30.243081,120.1258987,14z/data=!3m1!4b1!4m5!3m4!1s0x344b62c0d149f2cb:0xf0f28861cfd37ec9!8m2!3d30.2427011!4d120.1502699?hl=zh-CN

%E8%A5%BF%E6%B9%96: 西湖的URLEncode编码,可以在这里解码(https://tool.oschina.net/encode?type=4),打作英文的话,是west+lake(west%20lake)。

至于其他的参数,你不必管它,因为网站常常在 URL 中添加额外的数据,用于帮助追踪访问者或定制网站数据。

所以网址的构成是:https://www.google.com/maps/place/ + Keywords, 那这样接下去就很简单了,如下:

1
2
3
4
5
6
7
8
9
10
11
#! python3 
# mapIt.py
import webbrowser, sys
if len(sys.argv) > 1:
## sys.argv 变量保存了程序的文件名和命令行参数的列表,这里去掉程序的名称
address = ' '.join(sys.argv[1:])
else:
## 处理剪贴板内容,从剪切板得到信息
address = pyperclip.paste()

webbrowser.open('https://www.google.com/maps/place/' + address)

在终端键入python mapIt.py west lake, hangzhou 即可在Google地图中打开杭州西湖的地图,此时sys.argv['mapIt.py', 'west', 'lake,', 'hangzhou'],如果你还不知道它的用法的话。

Selenium简介

python的selenium 模块是个好东西,它能让我们的程序模拟真实的人类直接控制浏览器来完成复杂的网页操作。

首先呢,我们需要安装浏览器驱动,谷歌浏览器在这儿:https://chromedriver.storage.googleapis.com/index.html 火狐浏览器在这儿:https://github.com/mozilla/geckodriver/releases,记得与你的浏览器版本号相匹配,并添加环境变量。

Webdriver

现在,我们就可以用selenium启动浏览器啦,以谷歌浏览器为例:

1
2
3
4
from selenium import webdriver
browser = webdriver.Chrome()
type(browser)
# <class 'selenium.webdriver.chrome.webdriver.WebDriver'>

此时,运行程序,会自动打开一个浏览器测试窗口,此外selenium提供其他的浏览器接口:

  • browser = webdriver.Firefox()
  • browser = webdriver.Edge()
  • browser = webdriver.Safari()
  • browser = webdriver.PhantomJS()(已弃用)

在页面中寻找元素

selenium提供成**find_element_**和 **find_elements_**方法,可以让我们快速的在页面中寻找我们需要的元素,

find_element(By.XX, “YY”) find_elements(By.XX, ‘YY’)
find_element_by_id find_elements_by_id
find_element_by_name find_elements_by_name
find_element_by_xpath find_elements_by_xpath
find_element_by_link_text find_elements_by_link_text
find_element_by_partial_link_text find_elements_by_partial_link_text
find_element_by_tag_name find_elements_by_tag_name(不区分大小写)
find_element_by_class_name find_elements_by_class_name
find_element_by_css_selector find_elements_by_css_selector
1
2
3
input= browser.find_element_by_css_selector('#q')
input = browser.find_element_by_xpath('//*[@id="q"]')
input = browser.find_element_by_id('q')

如果页面上没有元素匹配该方法要查找的元素,selenium 模块就会抛出 NoSuchElement异常。如果你不希望这个异常让程序崩溃,就在代码中添加 try 和 except 语句。

1
2
3
4
5
6
7
8
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
except:
print('Was not able to find an element with that id.')
finally:
browser.close()

一旦有了 WebElement 对象,我们就可以做很多事情了,

属性或方法 描述
tag_name 标签名,例如’a’表示元素
get_attribute(name) 该元素 name 属性的值
text 该元素内的文本,例如hello中的’hello’
clear() 对于文本字段或文本区域元素,清除其中输入的文本
is_displayed() 如果该元素可见,返回 True,否则返回 False
is_enabled() 对于输入元素,如果该元素启用,返回 True,否则返回 False
is_selected() 对于复选框或单选框元素,如果该元素被选中,选择 True,否则返回 False
location 一个字典,包含键’x’和’y’,表示该元素在页面上的位置

我们还可以通过click()方法以及键盘事件,模拟鼠标键盘与web页面的交互行为,还可调用 send_keys()方法对的