安装模块、浏览器和对应的驱动
安装selenium:
#指定位置安装:
pip install -i https://pypi.douban.com/simple selenium --target C://xx/xx/site-packages
#查看安装与否:
pip show selenium
安装火狐浏览器和浏览器驱动:
火狐浏览器驱动下载链接:Releases · mozilla/geckodriver · GitHub
将下载的exe驱动放进环境变量:
按win+R,输入:
sysdm.cpl
打开系统配置,将exe路径加入到path变量里
selenium的一些操作
1.页面元素定位:
#属性class定位:
'<div class="toolbar-search-container">'
driver.find_element_by_class_name("toolbar-search-container")
#tag定位(div、p、input):
'<div class="toolbar-search-container">'
driver.find_element_by_tag_name("div")
link定位,用于根据文本打开对应的链接:
from selenium import webdriver
driver=webdriver.Firefox()
url=""
driver.get(url)
href_url=driver.find_element_by_link_text("博客").click()
根据xpath或是css定位元素:
driver.find_element_by_xpath()
driver.find_element_by_css_selector()
#括号内的str可以通过浏览器的检查功能复制
xpath进行多个元素的定位,返回的是list类型数据:
driver.find_elements_by_xpath()
#将element换成elements,其他方法修改相同
2.浏览器的操纵(是否弹出,修改窗口大小):
修改打开的浏览器窗口大小:
# 设置浏览器浏览器的宽高为:600x800
driver.set_window_size(600, 800)
直接让打开的浏览器全屏:
driver.maximize_window()
用selenium进行爬虫时不弹出浏览器:
from selenium.webdriver.firefox.options import Options
#options 里面headless设置为true,传入到Firefox里:
options = Options()
options.headless = True
driver = webdriver.Firefox(firefox_options=options)
3.浏览器页面内操作(多页面的切换、新标签内打开新页面、页面刷新、句柄切换):
一个窗口标签内打开多个页面这种情况下,实现在页面间切换:
#返回:
driver.back()
#前进:
driver.forward()
通过执行js语句在新窗口标签内打开新页面:
#编写js语句字符串:
url='*****'
js = "window.open(url)"
#执行js语句:
driver.execute_script(js)
页面内刷新:
# 刷新页面
driver.refresh()
浏览器窗口标签的切换:
#每个窗口标签都有一个独特的句柄
# 获取打开的多个窗口句柄,一个list类型数据:
windows = driver.window_handles
#每打开一个新标签,就会在句柄list中添加新句柄,新窗口句柄索引值为-1(放在最末)
#切换到当前最新打开的窗口:
driver.switch_to.window(windows[-1])
4.页面元素的操作:
获取元素内属性、进行页面内表单文本输入:
#一个搜索框元素:
'<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="selenium" style="text-indent: 32px;">'
#根据xpath进行元素定位:
element=driver.find_element_by_xpath('//*[@id="toolbar-search-input"]')
#获取元素中的属性值:
element.get_attribute('placeholder') #返回"selenium"
element.clear() #清除文本内容
element.send_keys('如何用selenium在搜索框输入信息') #向搜索框输入文本
获取元素的文本信息:
#一个a标签:
'<a data-report-query="spm=3001.4482" href="">学习</a>'
#定位标签:
a=driver.find_element_by_css_selector('#csdn-toolbar > div > div > div.toolbar-container-left > ul > li:nth-child(3) > a')
#获取标签中的文本:
print(a.text) #返回'学习'
5.鼠标操作:
左键单击:
# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 执行单击操作
button.click()
右键单击:
from selenium.webdriver.common.action_chains import ActionChains
# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 右键搜索按钮
ActionChains(driver).context_click(button).perform()
左键双键:
# 定位搜索按钮
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 执行双击动作
ActionChains(driver).double_click(button).perform()
拖动,从源元素拖动到目标元素:
# 定位要拖动的元素
source = driver.find_element_by_xpath('xxx')
# 定位目标元素
target = driver.find_element_by_xpath('xxx')
# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
鼠标悬浮:
from selenium.webdriver.common.action_chains import ActionChains
# 定位收藏栏
collect = driver.find_element_by_xpath('//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a')
# 悬停至收藏标签处
ActionChains(driver).move_to_element(collect).perform()
6.窗口切换和表单切换
1.切换窗口:
打开一个新链接页面,selenium定位的源代码还是之前的旧网页,要定位新链接网页里的元素,需要切换窗口:
打开一个url链接,查看当前链接的句柄:
driver.get('')
# 获取当前窗口的句柄
print(driver.current_window_handle)
打开一个页面内链接(在新窗口打开),查看所有窗口的句柄:
driver.find_element_by_xpath('//*[@id="mainContent"]/aside/div[1]/div').click()
# 获取当前所有窗口的句柄:
print(driver.window_handles) #一个ist类型数据
新窗口的句柄是list中的最末元素(根据时间顺序排序),利用索引值-1切换到最后一个句柄:
# 切换窗口:
driver.switch_to.window(driver.window_handles[-1])
2.切换表单:
通过xpath定位元素iframe的位置:
# 通过xpath定位
iframe_label = driver.find_element_by_xpath('/html/body/iframe')
定位表单,从而可以访问表单中的元素:
#根据xpath定位的iframe元素进行切换:
driver.switch_to.frame(iframe_label) #括号内可以直接是iframe的name属性值或是id属性值
#现在可以访问到iframe里的元素:
driver.find_element_by_xpath('xxx')
cookies
与服务器建立会话,服务器发送给登录用户浏览器的一个临时的身份凭证。我们可以利用这个信息进行一些免密码登录
通过selenium获取cookies:
#输出所有cookie信息
print(driver.get_cookies()) #list数据,list的元素是多个cookies字典
print(driver.get_cookies("xxx")) #输出name属性值是“xxx”的cookies信息
[{"name":"xxx","value":"xxx","path":"xx","domain":"xxx","secure":"xxx",sameSite:"None"},{...}]
向selenium里传入cookies:
url="xxxx"
cookies={"name":"xxxx","value":"xxxxx"} #dict中必须有name和value的键值对
driver.add_cookie(cookie_dict=cookies) #添加cookies字典
driver.get(url) #发送请求
将cookies字典传给get():
#将获取的cookies传入到get:
import requests #导入模块
r=equests.get(url,cookies=cookies,headers=headers) #将cookies字典作为参数传入get
print(r.status_code)
print(r.text)
利用网页【检查】中第一个ALL元素,其headers下有cookies元素:
将登陆后的cookie信息(如上) 复制为一个字符串,转换为字典:
cookies_data="复制的cookies信息"
cookie_dict={} #建立一个装cookies信息的字典
#将字符串转化为字典:
cookies_data__=cookies_data.split(";") #将一个个键值对劈开成list
for i in cookies_data__:
i=i.split("=")
cookie_dict[i[0].strip()]=i[1].strip() #将字符串按"="劈开,添加到字典里
利用这份cookie信息进行请求需要登录才能访问的网页:
import requests
url='*******'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
'Referer':'http://www.xxx.com/user/login.asp?url=http://www.xxx.com/',
'Content-Type':'application/x-www-form-urlencoded',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
#发送请求:
r=requests.get(url,headers=headers,cookies=cookie_dict)
print(r.status_code)
从浏览器的检查里的获取的请求体的cookies数据没有name和value(应该说是很多了...)不能在selenium上使用。