首页 > 技术文章 > selenium

zenan 2018-03-07 14:38 原文

1.1什么是selenium

selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题、通过账号密码获取cookies(基于各大网站登录验证码的升级,特别是12306)。

 

1.2centos7无桌面环境部署

安装火狐浏览器

$ yum install firefox

  

安装selenium

$ pip3 install selenium

安装Firefoxdriver

$ wget https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux64.tar.gz
$ tar -zxvf geckodriver-*.tar.gz
$ ln -s /root/geckodriver /usr/bin/geckodriver


# 最新版本下载
https://github.com/mozilla/geckodriver/releases

启动程序测试

from selenium import webdriver


options = webdriver.FirefoxOptions()
options.add_argument('-headless')
b = webdriver.Firefox(firefox_options=options)
b.get('http://www.baidu.com')
print(b.page_source)
b.quit()

  

  

1.3最新chromedriver安装

phantomjs逐步淡出我们的实现,已经不再被支持,chrome集高并发的优点,且目前也已支持无头浏览器。

安装chrome

$ curl https://intoli.com/install-google-chrome.sh | bash  

查看下载的chrome版本,命令行会有显示,然后根据chrome版本选择相对应的chromedriver

$ google-chrome --version

Google Chrome 84.0.4147.125

测试

$ google-chrome-stable --no-sandbox --headless --disable-gpu --screenshot     https://www.suning.com/ # 在当前路径下生成一张截图。

下载最新版本的chromedriver,

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

# 解压
$ unzip chromedriver_linux64.zip

# 测试
$ ./chromedriver

# 加入环境变量

 

实际环境中采用的写法,并成功了.

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 使用代理ip
chrome_options.add_argument("--proxy-server=http://202.20.16.82:10152")
# 使用headless无界面浏览器模式
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
# 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--disable-gpu')
# 禁止加载图片
chrome_options.add_argument('blink-settings=imagesEnabled=false')
# 设置默认请求头
chrome_options.add_argument("user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'")
wd = webdriver.Chrome(chrome_options=chrome_options,executable_path='/home/chrome/chromedriver')

wd.get("https://www.163.com")

content = wd.page_source.encode('utf-8')
print(content)

wd.quit()

  

    

1.3selenium的基本使用

 

声明浏览器对象

1 from selenium import webdriver
2 
3 browser = webdriver.Chrome()
4 browser = webdriver.Firefox()

访问页面

1 from selenium import webdriver
2 
3 browser = webdriver.Chrome(executable_path="D:\SeleniumDemo-master\chromedriver.exe")
4
5 browser.get("http://www.baidu.com")

6 print(browser.page_source)

7 browser.quit() # quit关闭所有并清除缓存,close仅仅关闭当前页

查找单个元素

 1 from selenium import webdriver
 2 
 3 browser = webdriver.Chrome()
 4 
 5 browser.get("http://www.taobao.com")
 6 input_first = browser.find_element_by_id("q")
 7 input_second = browser.find_element_by_css_selector("#q")
 8 input_third = browser.find_element_by_xpath('//*[@id="q"]')
 9 print(input_first)
10 print(input_second)
11 print(input_third)
12 browser.close()

查找多个元素

1 from selenium import webdriver
2 
3 
4 browser = webdriver.Chrome()
5 browser.get("http://www.taobao.com")
6 lis = browser.find_elements_by_css_selector('.service-bd li')
7 print(lis)
8 browser.close()

元素交互操作

对于获取的元素调用交互方法

 1 from selenium import webdriver
 2 
 3 import time
 4 
 5 browser = webdriver.Chrome()
 6 browser.get("http://www.taobao.com")
 7 input_str = browser.find_element_by_id('q')
 8 input_str.send_keys("ipad")
 9 time.sleep(1)
10 input_str.clear()
11 input_str.send_keys("MakBook pro")
12 button = browser.find_element_by_class_name('btn-search')
13 button.click()

Frame

在很多网页中都是有Frame标签,所以我们爬取数据的时候就涉及到切入到frame中以及切出来的问题,通过下面的例子演示
这里常用的是switch_to.from()和switch_to.parent_frame()

 1 import time
 2 from selenium import webdriver
 3 from selenium.common.exceptions import NoSuchElementException
 4 
 5 browser = webdriver.Chrome()
 6 url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
 7 browser.get(url)
 8 browser.switch_to.frame('iframeResult')
 9 source = browser.find_element_by_css_selector('#draggable')
10 print(source)
11 try:
12     logo = browser.find_element_by_class_name('logo')
13 except NoSuchElementException:
14     print('NO LOGO')
15 browser.switch_to.parent_frame()
16 logo = browser.find_element_by_class_name('logo')
17 print(logo)
18 print(logo.text)

 

推荐阅读