安装模块、浏览器和对应的驱动

安装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()

python selenium FirefoxOptions 设置代理IP无效 selenium python调用火狐_爬虫

 根据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元素: 

python selenium FirefoxOptions 设置代理IP无效 selenium python调用火狐_爬虫_02

将登陆后的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上使用。