python - crawler 之 selenium usage & selenium options参数 & selenium配置参数

目录

一、配置chrome选项参数

1.chrome常用选项参数

(1)配置chrome浏览器的选项

(2)chrome options参数主要配置

2.常用配置案例

(1)配置下载目录下载路径

(2)设置编码格式

(3)模拟移动设备(手机)

(4)禁止图片加载

(5)Chrome 的限制图片、javascript和css

(6)添加代理

(7)模拟鼠标设置浏览器选项

(8)添加浏览器扩展应用

3.chrome其他参数

(1)chrome地址栏命令

(2)chrome实用参数  

二、selenium Headless模式

1.Firefox浏览器

2.Chrome浏览器

三、常用操作案例

1.selenium控制浏览器

2.控制浏览器滚动或滚动务

3.节点交互动作

4.动作链(鼠标拖曳、键盘按键)

5.执行JavaScript

6.获取节点信息

7.切换Frame

8.前进和后退

9.选项卡管理(下拉框)

10.异常处理

11.selenium保存网页

12.add_cookie增加cookie登录 

13.handle窗口、iframe切换、alert弹框切换

14.chrome设置代理IP

15.selenium添加User-Agent

16.selenium操作cookie



一、配置chrome选项参数

1.chrome常用选项参数

(1)配置chrome浏览器的选项

默认情况下selenium打开一个纯净的chrome浏览器,若要添加一些插件,扩展,代理之类的应用,则需要设置chrome配置参数options,常用的行为有: 
禁止图片和视频的加载:提升网页加载速度。
添加代理:用于翻墙访问某些页面,或者应对IP访问频率限制的反爬技术。
使用移动头:访问移动端的站点,一般这种站点的反爬技术比较薄弱。
添加扩展:像正常使用浏览器一样的功能。
设置编码:应对中文站,防止乱码。
阻止JavaScript执行。

(2)chrome options参数主要配置

设置 chrome 二进制文件位置 (binary_location)
添加启动参数 (add_argument)
添加扩展应用 (add_extension, add_encoded_extension)
添加实验性质的设置参数 (add_experimental_option)
设置调试器地址 (debugger_address)

使用案例:
# 设置默认编码为 utf-8,也就是中文
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
driver = webdriver.Chrome(chrome_options = options)


2.常用配置案例

(1)配置下载目录下载路径

from selenium import webdriver
option = webdriver.ChromeOptions()
#设置成用户自己的数据目录,
option.add_argument('--user-data-dir=C:\Users\Chrome\User Data') 
#或option.add_argument(r"user-data-dir=C:\User Data2")
driver=webdriver.Chrome(chrome_options=option)
查看数据目录方法,在浏览器输入chrome://version


(2)设置编码格式

# 设置默认编码为 utf-8,也就是中文
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
driver = webdriver.Chrome(chrome_options = options)

(3)模拟移动设备(手机)

因为移动版网站的反爬虫的能力比较弱,手机user-agent可网上查找
# 通过设置user-agent,用来模拟移动设备
# 比如模拟 android QQ浏览器

from selenium import webdriver
option = webdriver.ChromeOptions()
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 
Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com/')

# 模拟iPhone 6
options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')

(4)禁止图片加载

不加载图片可以提升爬取速度。
# 禁止图片的加载
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images":2}
chrome_options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://www.baidu.com/")

# 启动浏览器,并设置好wait
browser = webdriver.Chrome(chrome_options=chrome_options)
# 根据桌面分辨率来定,主要是为了抓到验证码的截屏
browser.set_window_size(configure.windowHeight, configure.windowWidth)   
wait = WebDriverWait(browser, timeout = configure.timeoutMain)

(5)Chrome 的限制图片、javascript和css

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
# 添加无头selenium
options.add_argument('--headless')
# 2代表禁止加载,1代表允许加载
prefs = {
        'profile.default_content_setting_values': {
            'images': 2,
            'permissions.default.stylesheet':2,
            'javascript': 2
        }
    }
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=options)

(6)添加代理

from selenium import webdriver
# 静态IP:102.23.1.105:2005
# 阿布云动态IP:http://D37EPSERV96VT4W2:CERU56DAEB345HU90@proxy.abuyun.com:9020
PROXY = "proxy_host:proxy:port"
options = webdriver.ChromeOptions()
desired_capabilities = options.to_capabilities()
desired_capabilities['proxy'] = {
    "httpProxy": PROXY,
    "ftpProxy": PROXY,
    "sslProxy": PROXY,
    "noProxy": None,
    "proxyType": "MANUAL",
    "class": "org.openqa.selenium.Proxy",
    "autodetect": False
}
driver = webdriver.Chrome(desired_capabilities = desired_capabilities)

(7)模拟鼠标设置浏览器选项

在selenium爬虫启动时,首先开一个窗口,在地址栏键入:chrome://settings/content 
或 chrome://settings/privacy

(8)添加浏览器扩展应用

selenium打开的是不带扩展的纯净的浏览器,若爬取数据时需要借助一些插件,比如解析类xpath helper,翻译类,获取额外信息(销量)等。那我们怎么在启动chromedriver时,带上一些我们需要的插件呢
下面以在chrome中加载Xpath Helper插件为例:
1)下载相应的插件
Xpath Helper下载地址:http://download.csdn.net/download/gengliang123/9944202 
如下,是一个 以 crx 为后缀的文件: 
Xpah-Helper_v2.0.2.crx

2)将插件路径填入代码中
# 添加xpath helper应用
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 设置好应用扩展
extension_path = 'D:/extension/XPath-Helper_v2.0.2.crx'
chrome_options.add_extension(extension_path)
# 启动浏览器,并设置好wait
browser = webdriver.Chrome(chrome_options=chrome_options)

3.chrome其他参数

(1)chrome地址栏命令

在Chrome的浏览器地址栏中输入以下命令,就会返回相应的结果。
about:version - 显示当前版本 
about:memory - 显示本机浏览器内存使用状况 
about:plugins - 显示已安装插件 
about:histograms - 显示历史记录 
about:dns - 显示DNS状态 
about:cache - 显示缓存页面 
about:gpu -是否有硬件加速 
about:flags -开启一些插件 //使用后弹出:“请小心,这些实验可能有风险”,不知会不会搞乱俺的配置啊! 
chrome://extensions/ - 查看已经安装的扩展 
  

(2)chrome实用参数  

其他的一些关于Chrome的实用参数及简要的中文说明,使用方法同上4.5.4,当然也可以在shell中使用。 
–user-data-dir=”[PATH]” 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区。 
–disk-cache-dir=”[PATH]“ 指定缓存Cache路径 
–disk-cache-size= 指定Cache大小,单位Byte 
–first run 重置到初始状态,第一次运行 
–incognito 隐身模式启动 
–disable-javascript 禁用Javascript 
–omnibox-popup-count=”num” 将地址栏弹出的提示菜单数量改为num个。我都改为15个了。 
–user-agent=”xxxxxxxx” 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果 
–disable-plugins 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果 
–disable-javascript 禁用JavaScript,如果觉得速度慢在加上这个 
–disable-java 禁用java 
–start-maximized 启动就最大化 
–no-sandbox 取消沙盒模式 
–single-process 单进程运行 
–process-per-tab 每个标签使用单独进程 
–process-per-site 每个站点使用单独进程 
–in-process-plugins 插件不启用单独进程 
–disable-popup-blocking 禁用弹出拦截 
–disable-plugins 禁用插件 
–disable-images 禁用图像 
–incognito 启动进入隐身模式 
–enable-udd-profiles 启用账户切换菜单 
–proxy-pac-url 使用pac代理 [via 1/2] 
–lang=zh-CN 设置语言为简体中文 
–disk-cache-dir 自定义缓存目录 
–disk-cache-size 自定义缓存最大值(单位byte) 
–media-cache-size 自定义多媒体缓存最大值(单位byte) 
–bookmark-menu 在工具 栏增加一个书签按钮 
–enable-sync 启用书签同步 
–single-process 单进程运行Google Chrome 
–start-maximized 启动Google Chrome就最大化 
–disable-java 禁止Java 
–no-sandbox 非沙盒模式运行

 

二、selenium Headless模式

新版本的Selenium不再支持PhantomJS,而Firefox和Chrome都带有无头模式

1.Firefox浏览器

#开启Headless Firefox模式
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support.wait import WebDriverWait
if __name__ == "__main__":
    options = Options()
    options.add_argument('-headless') # 无头参数
    driver = Firefox(executable_path='geckodriver', firefox_options=options) 
# 配了环境变量第一个参数就可以省了,不然传绝对路径
    wait = WebDriverWait(driver, timeout=10)
    driver.get('http://www.google.com')
    wait.until(expected.visibility_of_element_located((By.NAME, 'q'))).send_keys('headless firefox' + Keys.ENTER)
    wait.until(expected.visibility_of_element_located((By.CSS_SELECTOR, '#ires a'))).click()
    print(driver.page_source)
    driver.quit()


2.Chrome浏览器

#开启Headless Chrome模式
使用headless Chrome需要安装chromedriver,并在Options配置为headless模式即可。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options) #有则为无头模式
# 如果没有把chromedriver加入到PATH中,就需要指明路径 executable_path='/home/chromedriver'

driver.get("https://cnblogs.com/")
# 获取网页源代码
content =driver.page_source
除了变成无头模式外,其命令和chrome有头时的一样

2.headless无头selenium
from selenium import webdriver
options = webdriver.ChromeOptions()
# options.add_experimental_option('prefs', prefs)
options.add_argument("--headless")
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--hide-scrollbars')
# options.add_argument(self.user_agent)
# driver = webdriver.Chrome(executable_path="/Users/bing/desktop/chromedriver", options=options)
driver = webdriver.Chrome(executable_path='/usr/bin/chromedriver', options=options)
# driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
url='https://www.amazon.com/s?k=men+durags&page=1'
driver.get(url)
print(driver.title)

案例:selenium爬取京东商品名称与价格
import time
from selenium import webdriver
from bs4 import BeautifulSoup

url = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=1&s=1&click=0"
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
option.add_argument('--headless')
option.add_argument('--disable-gpu')
#调用chrome浏览器驱程
driver = webdriver.Chrome(chrome_options=option)
#最大化窗口
driver.maximize_window()
driver.implicitly_wait(3)
driver.get(url)

# 模拟下滑到底部操作
for i in range(1, 5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(1)

# 将加载好的页面源码给bs4解析
soup = BeautifulSoup(driver.page_source, "html.parser")
# 进行信息的抽取(商品名称,价格)
goods_info = soup.select(".gl-item")
for info in goods_info:
    title = info.select(".p-name.p-name-type-2 a")[0].text.strip()
    price = info.select(".p-price")[0].text.strip()
    print(str(title).replace('\n',' ')+r'|'+str(price).replace('\n',' '))
driver.close()

案例:爬虫百度动态加载数据
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
 
# 启动driver
def init_web_driver():
    global driver
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    driver_path = 'E:\chromedriver.exe'    #这里放的就是下载的driver本地路径
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path = driver_path)
 
# 关掉driver
def close_web_driver():
    driver.quit()

def get_data():
    driver.get('https://www.baidu.com')
    driver.implicitly_wait(10)  # wait up to 10 seconds for the elements to become available
    # ======  网页中静态部分抓取,采用BeautifulSoup去解析   
    html = driver.page_source    # 获取网页html
    html_soup = BeautifulSoup(html.text,"lxml")
    time.sleep(0.1)
    coin_list = html_soup .find(name='table', attrs={"class": "table maintable"})
    # 页面元素的提取请查看 BeautifulSoup的用法
    # 网页中动态部分抓取,采用driver自带的方法
    # 下面展示从百度搜索框中输入"headless chrome",然后获取结果。具体自行百度driver的用法
    text = driver.find_element_by_css_selector('#kw')
    search = driver.find_element_by_css_selector('#su')
    text.send_keys('headless chrome')
    # search
    search.click()
    driver.get_screenshot_as_file('search-result.png')
    results = driver.find_elements_by_xpath('//div[@class="result c-container "]')
    for result in results:
        res = result.find_element_by_css_selector('a')
        title = res.text
        link = res.get_attribute('href')
        print ('Title: %s \nLink: %s\n' % (title, link) )

if __name__ == '__main__':
    init_web_driver()
    get_data()
    close_web_driver()
 


三、常用操作案例

1.selenium控制浏览器

(1) 基础例子
from selenium import webdriver   
 #声明chrome浏览器对象
browser = webdriver.Chrome()              
browser.get("http://www.baidu.com")      
#通过id=kw定位到百度的输入框
browser.find_element_by_id("kw").send_keys("selenium")   
#通过 id=su 定位到搜索按钮
browser.find_element_by_id("su").click()   
browser.quit()                                      

(2)隐藏浏览器信息提示
在浏览器配置里加个参数,忽略掉这个警告提示语,disable_infobars
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars') 
browser = webdriver.Chrome(chrome_options=option) 

(3)开启浏览器headless模式
启动浏览器的时候不想看的浏览器运行
option = webdriver.ChromeOptions()
option.add_argument('--headless')
option.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=option) 

 

2.控制浏览器滚动或滚动务

方法一:调过JS脚本控制
滚动条并非页面元素,需借助JavaScript来控制浏览器滚动条,webdriver提供execute_script()方法来执行JavaScript代码。滚动条位置的代码如下
<body  οnlοad= "document.body.scrollTop=0 ">
<body  οnlοad= "document.body.scrollTop=100000 ">

#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

方法二:其他调用js脚本拖动滚动条方式
(1)使用scrollTo
#<!--window.scrollTo(左边距,右边距);-->
window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。参数1表示水平的左间距,参数2表示垂直的上边距。

#设置浏览器窗口
driver.set_window_size(600,600)
driver.find_elelment_by_id(‘kw‘).send_keys(‘selenium‘)
driver.find_element_by_id("su").click()
#通过JavaScirpt设置浏览器窗口的滚动条位置
js = "window.scrollTo(100,450)"
driver.execute_script(js)

(2)使用scrollBy
driver.execute_script("window.scrollBy(0,3000)")
driver.execute_script("window.scrollBy(0,5000)")


方法三:使用js脚本拖动到提定地方
target = driver.find_element_by_id("id_keypair")
driver.execute_script("arguments[0].scrollIntoView();", target) #拖动到可见的元素去
方法四:通过键盘 按“DOWN”键(或tab键),需要多"DOWN"几次才能拖到底
driver.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(keys.DOWN)

 

3.节点交互动作

比较常见的用法有:输入文字时用send_keys()方法,清空文字时用clear()方法,点击按钮时用click()方法。
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()
这里首先驱动浏览器打开淘宝,然后用find_element_by_id()方法获取输入框,然后用send_keys()方法输入iPhone文字,等待一秒后用clear()方法清空输入框,再次调用send_keys()方法输入iPad文字,之后再用find_element_by_class_name()方法获取搜索按钮,最后调用click()方法完成搜索动作。

 

4.动作链(鼠标拖曳、键盘按键)

如鼠标拖曳、键盘按键等,这些动作用另一种方式来执行,那就是动作链。例如现在实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处,可以这样实现:
from selenium import webdriver
from selenium.webdriver import ActionChains
 
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
首先,打开网页中的一个拖曳实例,然后依次选中要拖曳的节点和拖曳到的目标节点,接着声明ActionChains对象并将其赋值为actions变量,然后通过调用actions变量的drag_and_drop()方法,再调用perform()方法执行动作,此时就完成了拖曳操作。

 

5.执行JavaScript

对于某些操作,Selenium API并没有提供。比如,下拉进度条,它可以直接模拟运行JavaScript,此时使用execute_script()方法即可实现,代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
这里就利用execute_script()方法将进度条下拉到最底部,然后弹出alert提示框。
所以说有了这个方法,基本上API没有提供的所有功能都可以用执行JavaScript的方式来实现了。

 

6.获取节点信息

(1)get_attribute()方法来获取节点的属性
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo.get_attribute('class'))

(2)text获取节点内部的文本信息
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

(3)获取id、位置、标签名和大小
id属性可以获取节点id,location属性可以获取该节点在页面中的相对位置,tag_name属性可以获取标签名称,size属性可以获取节点的大小,也就是宽高。
from selenium import webdriver 
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

 

7.切换Frame

网页中有一种节点叫作iframe,也就是子Frame,相当于页面的子页面,它的结构和外部网页的结构完全一致。Selenium打开页面后,它默认是在父级Frame里面操作,而此时如果页面中还有子Frame,它是不能获取到子Frame里面的节点的。这时就需要使用switch_to.frame()方法来切换Frame。示例如下:
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')   #切换到子Frame
try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()            #切换回父Frame
logo = browser.find_element_by_class_name('logo')
print(logo.text)
首先通过switch_to.frame()方法切换到子Frame里面,然后尝试获取父级Frame里的logo节点(这是不能找到的),如果找不到的话,就会抛出NoSuchElementException异常,异常被捕捉之后,就会输出NO LOGO。接下来,重新切换回父级Frame,然后再次重新获取节点,发现此时可以成功获取了。
所以,当页面中包含子Frame时,如果想获取子Frame中的节点,需要先调用switch_to.frame()方法切换到对应的Frame,然后再进行操作。

 

8.前进和后退

平常使用浏览器时都有前进和后退功能,Selenium也可以完成这个操作,它使用back()方法后退,使用forward()方法前进。
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
这里我们连续访问3个页面,然后调用back()方法回到第二个页面,接下来再调用forward()方法又可以前进到第三个页面。

 

9.选项卡管理(下拉框)

在访问网页的时候,会开启一个个选项卡。在Selenium中,我们也可以对选项卡进行操作。示例如下:
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
首先访问百度,然后调用了execute_script()方法,这里传入window.open()这个JavaScript语句新开启一个选项卡。接下来,我们想切换到该选项卡。这里调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表。要想切换选项卡,只需要调用switch_to_window()方法即可,其中参数是选项卡的代号。这里我们将第二个选项卡代号传入,即跳转到第二个选项卡,接下来在第二个选项卡下打开一个新页面,然后切换回第一个选项卡重新调用switch_to_window()方法,再执行其他操作即可。

(1)通过select 进行定位下拉框

#通过index进行选择
Select(driver.find_element_by_id("cardType")).select_by_index(1)
#通过value进行选择
#Select(driver.find_element_by_id("cardType")).select_by_value(1)
#通过选项文字进行选择
#Select(driver.find_element_by_id("cardType")).select_by_visile_text("通用卡")
注:Select only works on <select> elements(Select只对<select>标签的下拉菜单有效)

(2)定位非<select>标签的下拉菜单


10.异常处理

在使用Selenium的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。这里我们可以使用try except语句来捕获各种异常。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()
这里我们使用try except来捕获各类异常。比如,我们对find_element_by_id()查找节点的方法捕获NoSuchElementException异常,这样一旦出现这样的错误,就进行异常处理,程序也不会中断了。
selenium常用异常:
(1)NoSuchElementException:没有找到元素
(2)NoSuchFrameException:没有找到iframe
(3)NoSuchWindowException:没找到窗口句柄handle
(4)NoSuchAttributeException:属性错误
(5)NoAlertPresentException:没找到alert弹出框
(6)lementNotVisibleException:元素不可见
(7)ElementNotSelectableException:元素没有被选中
(8)TimeoutException:查找元素超时


11.selenium保存网页

from selenium import webdriver
import time
browser = webdriver.Chrome()  
get_html = "test.html" 
#打开文件,准备写入
f = open(get_html,'wb')
url = 'www.baidu.com' # 这里填你要保存的网页的网址
browser.get(url)
time.sleep(2) # 保证浏览器响应成功后再进行下一步操作
#写入文件
f.write(browser.page_source.encode("gbk", "ignore")) # 忽略非法字符
print('写入成功')
#关闭文件
f.close()
 


12.add_cookie增加cookie登录 

1.selenuin添加cookie 登录跳过验证
http://www.cnblogs.com/mengyu/p/7078561.html 
https://www.cnblogs.com/zhao-ying-jie/p/7084636.html

2.selenium webdriver 如何添加cookie
https://blog.csdn.net/KaryKwok/article/details/80943843

 

13.handle窗口、iframe切换、alert弹框切换

selenium自动化中的三大切换(handle窗口、iframe切换、alert弹框)
https://www.cnblogs.com/kuaileya/p/11905363.html

 
14.chrome设置代理IP

代理IP注意事项: 
第一,代理IP最好是固定IP,不要选动态IP。常用的爬虫IP是高匿名动态IP,是通过拨号动态产生的,时效性一般在1~3分钟。对于scrapy这种并发度很高,又不需要登录的爬虫来说,非常合适,但是在浏览器渲染类爬虫中并不适用。
第二,代理IP的速度。因selenium采用浏览器渲染技术,本身慢。若代理IP慢,就会增加爬取耗时
第三,电脑内存要够大。因chrome耗内存,在并发度很高时易造成浏览器崩溃,也就是程序崩溃。
第四,在程序结束时,调用 browser.quit( ) 清除浏览器缓存。
方法1:
from selenium import webdriver
chromeOptions = webdriver.ChromeOptions()
# 设置代理,一定要注意,=两边不能有空格
chromeOptions.add_argument("--proxy-server=http://202.20.16.82:10152")
browser = webdriver.Chrome(chrome_options = chromeOptions)
# 查看本机ip,查看代理是否起作用
browser.get("http://httpbin.org/ip")
print(browser.page_source)
# 退出,清除浏览器缓存
browser.quit()

方法2:
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
proxy = Proxy({
        'proxyType': ProxyType.MANUAL,
        'httpProxy': get_proxy_ip_port()})
driver = webdriver.Firefox(proxy=proxy)
driver.get('http://httpbin.org/ip')

 

15.selenium添加User-Agent

from selenium import webdriver
option = webdriver.ChromeOptions()
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 
Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
driver = webdriver.Chrome(chrome_options=option)
driver.get('http://www.taobao.com/')

# 模拟iPhone 6
options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')

 

16.selenium操作cookie

使用Selenium,还可以方便地对Cookies进行操作,例如获取、添加、删除Cookies等。示例如下:
driver.add_cookie(cookie_dict) : 为当前会话添加 cookie 
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
driver.get_cookie(name) : 得到执行cookie 
driver.get_cookies() : 得到所有的 cookie
driver.delete_all_cookies() : 删除当前会话的所有cookie 
driver.delete_cookie(name) : 删除指定 cookie
(1)获取cookie
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
#获取cookie信息
cookies = driver.get_cookies()
#打印获取的cookies信息
print(cookies)
driver.quit()

(2)添加cookie
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.youdao.com")
#向cookie中name和value中添加回话信息
driver.add_cookie({'name': 'key-aaaaaaa', 'value': 'value-bbbbb'})
#遍历cookie中name和value信息并打印对应的信息,并包括添加对应的信息
for cookie in driver.get_cookies():
    print("%s->%s" % (cookie['name'], cookie['value']))
driver.quit()

(3)cookie综合案例
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

 
 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值