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