目录
(5)Chrome 的限制图片、javascript和css
13.handle窗口、iframe切换、alert弹框切换
一、配置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())