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-stable.x86_64 0:73.0.3683.103-1
测试
$ 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)