爬虫基础库之Selenium
1.简介
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
from selenium import webdriver browser=webdriver.Chrome() #谷歌 browser=webdriver.Firefox() #火狐 browser=webdriver.PhantomJS() #无界面浏览器 browser=webdriver.Safari() browser=webdriver.Edge()
2.安装
(1)selenium+chromedriver
#安装:selenium+chromedriver pip3 install selenium 下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.29,并非2.9 国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/2.29/ 最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads #验证安装 C:UsersAdministrator>python3 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> driver=webdriver.Chrome() #弹出浏览器 >>> driver.get('https://www.baidu.com') >>> driver.page_source #注意: selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver 下载链接:https://github.com/mozilla/geckodriver/releases
(2)selenium+phantomjs
#安装:selenium+phantomjs pip3 install selenium 下载phantomjs,解压后把phantomjs.exe所在的bin目录放到环境变量 下载链接:http://phantomjs.org/download.html #验证安装 C:UsersAdministrator>phantomjs phantomjs> console.log('egon gaga') egon gaga undefined phantomjs> ^C C:UsersAdministrator>python3 Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> driver=webdriver.PhantomJS() #无界面浏览器 >>> driver.get('https://www.baidu.com') >>> driver.page_source
3.基本使用
from selenium import webdriver #驱动浏览器 from selenium.webdriver import ActionChains #滑动验证 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys #键盘按键操作 from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() try: browser.get('https://www.baidu.com') #请求百度页面,可以看到它帮你打开了 input_tag=browser.find_element_by_id('kw') #找到input标签 input_tag.send_keys('美女') #python2中输入中文错误,字符串前加个u input_tag.send_keys(Keys.ENTER) #输入回车 wait=WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等到id为content_left的元素加载完毕,最多等10秒 print(browser.page_source) print(browser.current_url) print(browser.get_cookies()) finally: #不论怎样,下面的代码都会执行 browser.close()
4.选择器
(1)元素选取
想要对页面进行操作,首先要做的是选中页面元素。
定位一个元素 | 定位多个元素 | 含义 |
find_element_by_id | find_elements_by_id | 通过元素ID进行定位 |
find_element_by_name | find_elements_by_name | 通过元素名称定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式进行定位 |
find_element_by_link_text | find_elements_by_link_text | 通过完成超链接文本进行定位 |
find_element_partial_link | find_elements_partial_link | 通过部分超链接文本进行定位 |
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 | 通过CSS选择器进行定位 |
定位元素示例:
river = webdriver.Chrome() driver.get('https://www.baidu.com') print(1,driver.find_element_by_id('u')) print(2,driver.find_element_by_link_text('新闻')) print(3,driver.find_element_by_partial_link_text('闻')) print(4,driver.find_element_by_tag_name('a')) print(5,driver.find_element_by_class_name('s_tab')) print(6,driver.find_element_by_name('tj_settingicon')) print(7,driver.find_element_by_css_selector('.c-icon-triangle-down')) time.sleep(20) driver.close() 结果:都是一些对象 1 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-1")> 2 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-2")> 3 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-2")> 4 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-3")> 5 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-4")> 6 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-5")> 7 <selenium.webdriver.remote.webelement.WebElement (session="066063ad1cc136382f8c6a92d57e8d44", element="0.1652270453979785-6")>
除了上面具有确定功能的方法,还有两个方法find_element和find_elements,可以通过传入参数来指定功能,其实和上面的类似:
print(8,driver.find_element(By.ID,'u'))
常见的参数:
BY.ID BY.NAME BY.TAG_NAME BY.LINK_TEXT BY.CLASS_NAME BY.PARTIAL+LINK_TEXT BY.XPATH BY.CSS_SELECTOR
用法示例:
print(8,driver.find_element(By.ID,'u')) print(9,driver.find_element(By.LINK_TEXT,'新闻')) print(10,driver.find_element(By.NAME,'tj_settingicon')) print(11,driver.find_element(By.PARTIAL_LINK_TEXT,'闻')) print(12,driver.find_element(By.TAG_NAME,'a')) print(13,driver.find_element(By.CLASS_NAME,'s_tab')) print(14,driver.find_element(By.CSS_SELECTOR,'.c-icon-triangle-down'))