上文说到,我们可以通过分析Ajax访问服务器的方式来获取Ajax数据。Ajax也算动态渲染页面的一种。所以,动态页面也是可以爬取滴。
Selenium
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。简而言之,Selenium可以模拟用户操作浏览器,所以它也可以提取动态页面。
安装Selenium
cmd下输入:
pip install selenium
同时下载浏览器对应版本的驱动。
Chrome:
点击下载
Firefox:
点击下载
IE:
点击下载
下载后解压到python安装目录的scripts下。
Selenium基本使用方法
声明浏览器对象
Selenium支持许多的浏览器,我们首先需要让系统知道你使用的是什么浏览器,我们可以用以下方式初始化:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Sarari()
之后我们就可以使用调用browser对象,执行各种动作来模拟浏览器操作
访问页面
我们用get()方法来请求网页,只需要传入URL即可。这里我们访问百度页面,并打印出源代码:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(‘https://www.baidu.com’)
print(browser.page_source)
browser.close()
查找节点
单个节点
网页构成是一个个超文本标记语言构成的,这些就是网页的节点,我们想获取某个信息就需要知道这个信息所在的地方在哪里。那么这里要通过查看网页的源代码。
比如这里我想提取这个图片,通过查看源代码知道它是在名字为logo的div里面的一个链接等等。那我们就可以通过以下方法获取单个节点:
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()
另外还有个通用方法:
find_element()
这个方法比上面的方法更为灵活,需要传入两个参数,查找方式By和值:
from selenium import webdriver
from selenium webdriver.common.by import By
#...
input_first = browser.find_element(BY.ID, 'q')
#...
多个节点
多个节点我们需要find_elements()方法:
find_elements_by_id()
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()
也可以用
find_elements()
这里就不在详细赘述。
节点交互
Selenium最重要的就是可以和浏览器进行交互,其中常用的有:输入文字的send_key()方法;清空文字的clear()方法;点击按钮的click()方法。示例如下:
#...
brower.find_elements_by_id('StudentId')[0].send_keys(StudentId) # 填入学号
brower.find_elements_by_id('Name')[0].send_keys(Password) # 填入密码
brower.find_elements_by_id('codeInput')[0].send_keys(
brower.find_elements_by_id('code-box')[0].text) # 填入验证码
brower.find_elements_by_id('Submit')[0].click() # 提交登录表单
brower.find_elements_by_id('platfrom2')[0].click() # 选择健康填报
brower.find_elements_by_id('ckCLS')[0].click()
try:
brower.find_element_by_class_name('save_form').click() # 提交
time.sleep(3)
brower.close() # 关闭浏览器
#...
其中更多的操作可以参见官方文档的交互动作介绍:
点击链接
获取节点信息
获取属性
get_attribute()
获取文本值、id、位置、标签名和大小
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_naem)
print(input.size)
Selenium最主要的操作就是这样了,其他更多详细信息请访问以下页面:
点击链接