selenium总结

from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options

一、启动配置

self.chrome_options = Options()
self.chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.chrome_options.add_argument('--disable-gpu')
self.chrome_options.add_argument('--no-sandbox')
self.chrome_options.add_argument('--disable-dev-shm-usage')
self.chrome_options.add_argument('--disable-blink-features=AutomationControlled')  # 也是反检测
self.chrome_options.add_argument(
'user-agent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"')  # 设置ua
self.chrome_options.add_argument("start-maximized") # 初始化就最大化
self.chrome_options.add_argument('--user-data-dir=' + f'D:/pinduoduo/{userdata}')  # 自定义缓存保存位置,多用于登录
# self.chrome_options.add_argument('--headless')  # 无头模式

#设置代理 options.add_argument('proxy-server=' +'192.168.0.28:808')
# 设置selenium对象
self.browser = webdriver.Chrome(chrome_options=self.chrome_options)

二、selenium浏览器防检测

1、js文件地址:参考青南大佬  公众号:未闻的code

链接:https://pan.baidu.com/s/1l2m21r3HsHNaN6K2A_IxUw
提取码:gw2x
复制这段内容后打开百度网盘手机App,操作更方便哦

2、js = 

'''() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
}
'''

三、selenium执行js语句

self.browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js代码
})


四、selenium处理cookie cookie为字典格式
self.browser.delete_all_cookies()  # 删除原cookie
cookies = {item.split('=')[0]: item.split('=')[1] for item in cookie.split(';')}
print(cookies)
for key, value in cookies.items():
cookie_dict = {'domain': '.pinduoduo.com', 'name': key, 'value': value, "expires": '',
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
self.browser.add_cookie(cookie_dict)  # 新增cookie

五、selenium轨迹滑动公式  (遇见最合适的一个 )

def get_track(distance):
'''
拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
匀变速运动基本公式:
①v=v0+at
②s=v0t+(1/2)at²
③v²-v0²=2as

:param distance: 需要移动的距离
:return: 存放每0.2秒移动的距离
'''
# 初速度
v = 5
# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
t = 0.5
# 位移/轨迹列表,列表内的一个元素代表0.2s的位移
tracks = []
# 当前的位移
current = 0
# 到达mid值开始减速
mid = distance * 5 / 8

distance += 10 # 先滑过一点,最后再反着滑动回来
# a = random.randint(1,3)
while current < distance:
if current < mid:
# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
a = random.randint(1, 3) # 加速运动
else:
a = -random.randint(2, 4) # 减速运动

# 初速度
v0 = v
# 0.2秒时间内的位移
s = v0 * t + 0.5 * a * (t ** 2)
# 当前的位置
current += s
# 添加到轨迹列表
tracks.append(round(s))

# 速度已经达到v,该速度作为下次的初速度
v = v0 + a * t

# 反着滑动到大概准确位置
for i in range(4):
tracks.append(-random.randint(1, 3))
# for i in range(4):
# tracks.append(-random.randint(1,3))
random.shuffle(tracks)
return tracks
六、selenium拖动鼠标滑动
ActionChains(self.browser).click_and_hold(on_element=button).perform()
            webdriver.ActionChains(self.browser).move_by_offset(xoffset=0, yoffset=100).perform()
            time.sleep(0.15)
            for item in track: track为缺口距离
                webdriver.ActionChains(self.browser).move_by_offset(xoffset=item, yoffset=random.randint(-2, 2)).perform()
            # 稳定一秒再松开
            time.sleep(1)
            webdriver.ActionChains(self.browser).release(button).perform()
            time.sleep(1)
            # 随机拿开鼠标
            webdriver.ActionChains(self.browser).move_by_offset(xoffset=random.randint(200, 300),
                                                               yoffset=random.randint(200, 300)).perform()
            time.sleep(3)

使用selenium切换frame

frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是 driver.switch_to.frame()








原文地址:https://www.cnblogs.com/itBlogToYpl/p/14574722.html