1:动作链拖拽
导入动作链需要的包
from selenium.webdriver import ActionChains
具体步骤
#1:创建动作链对象,并绑定给浏览器
action = ActionChains(driver)
# 2:点击并长按指定标签
action.click_and_hold(div)
# perform:使动作链对象立即执行 move_by_offset(x,y)->方向坐标,传入像素
action.move_by_offset(260, 1).perform()
# 释放鼠标
ActionChains(driver).release().perform()
具体代码
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 动作链
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
driver.implicitly_wait(30)
# 要定位的元素在iframe里面,所以要先进去iframe里
# 进入框架
driver.switch_to.frame(driver.find_element(By.ID, 'iframeResult'))
div = driver.find_element(By.XPATH, '//*[@id="draggable"]') # 原位置
"""开始动作链---滑动"""
def demo_01():
"""方法1"""
# 方法1:方法一移动滑块,此方法一瞬间移动过去,不建议使用
# 执行拖动或者时滑动操作,基于动作链的实现
# 1:创建动作链对象,并绑定给浏览器
action = ActionChains(driver)
# 2:点击并长按指定标签
action.click_and_hold(div)
# perform:使动作链对象立即执行 move_by_offset(x,y)->方向坐标,传入像素
action.move_by_offset(260, 1).perform()
# #释放动作链对象
# action.release()
# 释放鼠标
ActionChains(driver).release().perform()
# 切换到弹窗视角
alert = driver.switch_to.alert
print(f"弹窗的title是:{alert.text}")
# 点击确定
alert.accept()
def demo_02():
"""方法二"""
# 方法二:按照偏移量进行移动,此刻移动滑块是水平向右移动
# 创建动作链对象, 并绑定给浏览器,点击并长按指定标签,perform:使动作链对象立即执行
ActionChains(driver).click_and_hold(div).perform()
# 偏移量的计算是目标位置x轴的值减去要移动的滑块的x轴的值
Target = driver.find_element(By.XPATH, '//*[@id="droppable"]') # 目标值
source = driver.find_element(By.XPATH, '//*[@id="draggable"]') # 原位置
offset = Target.location["x"] - source.location["x"]
i = 0
# 模拟缓慢的滑动
while i <= offset:
#time.sleep(0.1) #x的像素不能传的太大,否则补捉不到了
ActionChains(driver).move_by_offset(10, 0).perform()
i += 10
# 释放鼠标
ActionChains(driver).release().perform()
# 切换到弹窗视角
alert = driver.switch_to.alert
print(f"弹窗的title是:{alert.text}")
# 点击确定
alert.accept()
demo_02()
time.sleep(100)
2:selenium关于cookies的处理
有时候网站需要检查我们的cookies,在遇到了cookies是变化的,复杂的我们不像使用js逆向来处理.
这时候selenium是一个不错的选择
1:我们需要先点击浏览器的开发者工具
2:name是cookies的键;value是cookies的值
3:通过的方式来获取cookies,但是发现他的格式不对
json_cookies=driver.get_cookies()
print(json_cookies)
推荐js格式化代码的网站
https://www.qianbo.com.cn/Tool/Beautify/Js-Formatter.html
4:通过代码把cookies变为字典的形式
json_cookies=driver.get_cookies()
dic={}
for i in json_cookies:
dic[i["name"]]=i["value"]
return dic
这时候cookies的形式为字典
{'Hm_lpvt_9793f42b498361373512340937deb2a0': '1677130919', 'c_channel': '0', 'accessToken': 'avatarUrl%3Dhttps%253A%252F%252Fcdn.static.17k.com%252Fuser%252Favatar%252F13%252F13%252F07%252F99730713.jpg-88x88%253Fv%253D1670556244000%26id%3D99730713%26nickname%3D%25E6%2588%2591%25E9%2580%2581%25E4%25BD%25A0%25E5%2590%25A7123%26e%3D1692682913%26s%3D2c16f129a735fd33', 'c_csc': 'web', 'sajssdk_2015_cross_new_user': '1', '__bid_n': '1867ccae792637bdeb4207', 'FPTOKEN': 'pgOEbtULhdrBkYN6JKu38IOhcWH+wv27c1zLQcXC9LhMgrzoyq+VGwM9vH95NbYjGsQenkKv+cKd6enDTjn0nIvVuK1gsqeo/I1d9wcdj7mk6MbLVHqm64vA0O8Ntq0xA+vbeumE7D8rtYHgoAv//xpgNcZphiJvIcMBtFNVJekWTQoHiQwa6d8FIwSoNwTOBa+hVRwnpgv5bRiR2Fj93XmXlOLB8uc/LNoHU1I1Qapc339/jheUo39eCF8q/QdL5KUPpHLYRjt8pKYxtwmb2zBoJOxFpcKuN7jE63RtqkFKqhImQ5cEkKGPGMY01G2Vno+z3AHyQyFol/EnzkC47fVCx0FyKJB3vX3iADtFmCg3zLfPzZe1lpQfjCWYoEZzT+yKszWpgvLcPMr8aN8JDw==|Ovorl7o/fAalRT01jBlsCYAPBXLwcap3j4turldwt6U=|10|84bb5bd7a7f40d663c436e4ecd06d558', 'Hm_lvt_9793f42b498361373512340937deb2a0': '1677130918', 'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%2299730713%22%2C%22%24device_id%22%3A%221867ccae63c31f-007d7764b986a6-26031951-1327104-1867ccae63d1487%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22first_id%22%3A%2259ec2398-235f-4c9b-88bb-f5443b20d802%22%7D', 'GUID': '59ec2398-235f-4c9b-88bb-f5443b20d802'}
注意:不能直接放在请求头里面,因为他现在是字典的形式
url="https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
'Cookie':cookies
}
resp=requests.get(url=url,headers=headers).text
"""不能这么写"""
应该将cookies直接放在request里面
url="https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
}
resp=requests.get(url=url,headers=headers,cookies=cookies).text
"""应该这么写"""
完整代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.select import Select
from selenium.webdriver.chrome.options import Options
import csv
import requests
def selenium_01():
"完成登录操作"
#点击登录
driver.find_element(By.XPATH,'//*[@id="header_login_user"]/a[1]').click()
#进去ifarm框架里面
driver.switch_to.frame(driver.find_element(By.XPATH,'/html/body/div[20]/div/div[1]/iframe'))
#账号
driver.find_element(By.XPATH,'/html/body/form/dl/dd[2]/input').send_keys("input('请输入你的账号')")
#密码a
driver.find_element(By.XPATH, '/html/body/form/dl/dd[3]/input').send_keys("input('请输入你的密码')")
#点击阅读并同意17k 用户协议
driver.find_element(By.XPATH, '//*[@id="protocol"]').click()
#点击登录
driver.find_element(By.XPATH, '/html/body/form/dl/dd[5]/input').click()
def selenium_02():
json_cookies=driver.get_cookies()
dic={}
for i in json_cookies:
dic[i["name"]]=i["value"]
return dic
def response(cookies):
url="https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919"
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
}
resp=requests.get(url=url,headers=headers,cookies=cookies).text
print(resp)
def main():
selenium_01()
time.sleep(1)
cookies=selenium_02()
print(cookies)
response(cookies)
time.sleep(100)
if __name__ == '__main__':
driver = webdriver.Chrome()
driver.get("https://www.17k.com/")
driver.implicitly_wait(30)
main()