selenium这个三方库,最初是一个自动化测试工具,能够实现让浏览器完成自动化的操做。
selenium本质是经过驱动浏览器,彻底模拟浏览器的操做,好比跳转、输入、点击、下拉等,来拿到网页渲染以后的结果,可支持多种浏览器。
而爬虫中使用它主要是为了解决requests没法直接执行JavaScript代码的问题。html
官方文档:Selenium with Pythonpython
$ pip3 install selenium
Chrome——>关于Google Chromeweb
查看chrome和chromedriver的对应关系,我应该下载 70.0.3538.110 版本对应的chromedriver驱动。chrome
在谷歌浏览器驱动下载地址下载驱动:macos
我选择MAC版本的驱动下载,解压后,将文件chromedriver拷贝到项目目录下。api
from selenium import webdriver from time import sleep # 建立一个浏览器对象executable_path驱动的路径 bro = webdriver.Chrome(executable_path='./chromedriver') # get方法能够指定一个url,让浏览器进行请求 bro.get('https://www.baidu.com') sleep(1) # 等待打开页面 # 让百度进行指定词条的一个搜索 text = bro.find_element_by_id('kw') # 定位到text搜索文本框 text.send_keys('人民币') # send_keys表示向文本框中录入指定内容 sleep(1) # 等待文本输入 # 点击搜索按钮 button = bro.find_element_by_id('su') button.click() # click表示点击操做 sleep(3) # 等待查询结果 # 关闭浏览器 bro.quit()
from selenium import webdriver # 建立一个浏览器对象executable_path驱动的路径 bro = webdriver.Chrome(executable_path='./chromedriver') # get方法能够指定一个url,让浏览器进行请求 bro.get('https://www.baidu.com')
自动打开浏览器并进入百度页面:浏览器
find_element_by_id # 根据id找节点 find_elements_by_name # 根据name找 find_elements_by_xpath # 根据xpath查找 find_elements_by_tag_name # 根据标签名找 find_elements_by_class_name # 根据class名字查找
phantomJS是一款基于无界面的浏览器。其自动化操做流程和上述操做谷歌浏览器是一致的。
因为是无界面的(没法观察自动化过程),为了可以展现自动化操做流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。函数
我是MAC OS系统,所以下载MAC OS系统的PhantomJS驱动。下载zip压缩包后,解压文件,找到文件:phantomjs-2.1.1-macosx/bin/phantomjs。学习
from selenium import webdriver import time browser = webdriver.PhantomJS(executable_path='/Users/hqs/phantomjs-2.1.1-macosx/bin/phantomjs') # 打开浏览器 browser.get('http://www.baidu.com') time.sleep(2) # 截屏 browser.save_screenshot(r'./baidu.png') # 查找input输入框 text = browser.find_element_by_id('kw') # 定位到了text文本框 text.send_keys('美女') # send_keys表示向文本框中录入指定内容 time.sleep(1) # 再次截屏 browser.save_screenshot(r'./meinv.png') browser.quit()
代码执行后,会建立出三个文件:baidu.png、meinv.png和ghostdriver.log。
baidu.png:
meinv.png:
selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是经过动态加载js造成的,因此使用普通爬虫程序没法回去动态加载的js内容。例如豆瓣电影中的电影信息是经过下拉操做动态加载更多的电影信息。
from selenium import webdriver from time import sleep # 建立无界面的浏览器对象 browser = webdriver.PhantomJS(executable_path='/Users/hqs/phantomjs-2.1.1-macosx/bin/phantomjs') url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action=' # 打开浏览器 browser.get(url) sleep(1) # 截屏 browser.save_screenshot('./1.png') # 编写js代码:让页面中的滚轮向下滑动(到底部) js = 'window.scrollTo(0, document.body.scrollHeight)' # 水平方向不动,拖动到底部 # 让浏览器对象执行js代码 browser.execute_script(js) sleep(1) # 截屏(2) browser.save_screenshot('./2.png') # 获取了更多的页面 # 获取加载数据后的页面 # page_source获取浏览器当前的页面数据 page_text = browser.page_source # 页面源码更多
获取豆瓣电影中动态加载出更多的电影详情数据。