什么是Selenium
Selenium是一套完整的Web应用程序测试系统,它包含了测试的录制、编写及运行和测试的并行处理。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。完全有JavaScript编写,因此可以运行于任何支持JavaScript的浏览器上。
Selenium作为爬虫工具的优劣势分析
- 优势
不需要做复杂的抓包、构造请求、解析数据等,开发难度相对要低一些。其访问参数跟使用浏览器的正常用户一模一样,访问行为也相对更像正常用户,不容易被反爬虫策略命中。在需要模拟用户登录、浏览器滑动或点击时,使用Selenium执行js语句非常容易实现,比较适合动态网页的信息爬取。
2. 劣势
相比于抓包→构造请求→解析返回值的爬虫,由于Selenium需要生成一个浏览器环境,所有操作(与元素交互、获取元素内容等)均需要等待页面加载完毕后才可以继续进行,所以速度相比构造请求的慢很多。如果是爬取静态网页,不建议使用Selenium,原因是速度太慢,效率太低。建议使用其他爬虫工具,比如Scrapy。
Window系统下Selenium的安装与浏览器驱动配置
- 安装Selenium
第一步:安装配置Python环境,并安装pip组件。
第二步:在命令行工具中执行如下命令
pip install selenium
第三步:检查是否安装成功,再次执行上面命令,出现如下图所示,表示成功。
2. 配置浏览器驱动
第一步:查看支持的浏览器驱动,依次执行命令:
python
from selenium import webdriver
help(webdriver)
第二步:选择需要使用的浏览器驱动Webdriver,根据电脑的浏览器版本下载对应的驱动到本地。下面是常用驱动下载地址。
Chromedriver(谷歌浏览器) http://chromedriver.storage.googleapis.com/index.html
Geckodriver(火狐浏览器) https://github.com/mozilla/geckodriver/releases
IEdriver(IE浏览器) http://selenium-release.storage.googleapis.com/index.html
Operadriver(Opera浏览器) https://cnpmjs.org/mirrors/operadriver
第三步:将下载的驱动,拷贝到python安装目录。
至此,关于Selenium的安装和驱动配置就全部搞定,下面关于Selenium的使用。
Selenium的基础框架
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
options = Options()
options.add_argument('--headless') # 不打开浏览器
options.add_argument('--disable-gpu') # 禁用GPU硬件加速
options.add_argument('user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1"') # 添加访问头
# options.add_argument('proxy-server="60.13.42.109:9999"') # 添加代理
driver = webdriver.Chrome(options=options) # 使用驱动配置
driver.get("https://baike.baidu.com/item/%E4%BD%A0%E5%A5%BD/32416?fr=aladdin")
driver.implicitly_wait(10) # 等待时间
element = driver.find_element_by_xpath("//div[@class='para']") # 执行页面定位语句
isDisplayed = element.is_displayed() # 判断是否允许访问
print(isDisplayed)
print(element.text)
# 将滚动条移动到页面的顶部 0:为顶部;1000000:为底部
js = "var q=document.documentElement.scrollTop=10000000000" # js语句
driver.execute_script(js) # 执行语句
driver.close()