'''
今日内容:
1 selenium剩余用法
2 selenium万能登录破解
3 破解极验滑动验证码
'''
1
from selenium import webdriver driver=webdriver.Chrome(r'D:\chromedriver_win32\chromedriver.exe') try: driver.implicity_wait(5) # 隐式等待:写在get请求前 # 显式等待:写在get请求后 # wait.until(...) driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html') # 根据xpath语法查找元素 # /从根节点开始找第一个 html=driver.find_element_by_xpath('/html') # html=driver.find_element_by_xpath('/head') # 报错 print(html.tag.name) # //从根节点开始找任意一个节点 div=driver.find_element_by_xpath('//div') print(div.tag_name) # @ # 查找id为images的div节点 div=driver.find_element_by_xpath('//div[@id="images"]') print(div.tag_name) print(div.text) # 找到第一个a节点 a=driver.find_element_by_xpath('//a') print(a.tag_name) # 找到所有a节点 a_s=driver.find_elements_by_xpath('//a') print(a_s) # 找到第一个a节点的href属性 # get_attribute:获取节点中某个属性 a=driver.find_element_by_xpath('//a').get_attribute('href') print(a) finally: driver.close()
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver=webdriver.Chrome(r'D:\chromedriver_win32\chromedriver.exe') ''' 点击、清除操作 ''' try: driver.implicitly_wait(10) # 1 往jd发送请求 driver.get('https://www.jd.com/') # 找到输入框输入围城 input_tag=driver.find_element_by_id('key') input_tag.send_keys('围城') # 键盘回车 input_tag.send_keys(Keys.ENTER) time.sleep(2) # 找到输入框输入墨菲定律 input_tag=driver.find_element_by_id('key') input_tag.clear() input_tag.send_keys('墨菲定律') # 找到搜索按钮点击搜索 button=driver.find_element_by_class_name('button') button.click() time.sleep(10) finally: driver.close()
'' 选项卡 ''' import time from selenium import webdriver browser=webdriver.Chrome() try: browser.get('https://www.baidu.com') browser.execute_script( ''' windows.open(); ''' ) print(browser.window_handles) browser.switch_to.window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(5) browser(browser.window_handles[0]) browser.get('https://www.sina.com.cn') time.sleep(10) finally: browser.close()
'''
元素交互操作
'''
# ActionChains动作链
from selenium import webdriver from selenium.webdriver import ActionChains import time driver=webdriver.Chrome(r'D:\chromedriver_win32\chromedriver.exe') driver.implicitly_wait(10) driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') try: # driver.switch_to_frame('iframeResult') # 切换到id为iframeResult的窗口内 driver.seitch_to_frame('iframeResult') # 源位置 draggable=driver.find_element_by_id('draggable') # 目标位置 droppable = driver.find_element_by_id('droppable') # 调用ACtionChains,必须把驱动对象传进去 # 得到一个动作链对象,复制给一个变量 actions=ActionChains(driver) # 方式一 :机器人 # 瞬间把源图片位置秒移到图片位置 # actions.drag_and_drop(draggable,droppable) # actions.perform() # 执行编写好的行为 # 方式二: 模拟人的行为 source=draggable.location['x'] target=droppable.location['x'] print(source,target) distance=target-source print(distance) # perform: 每个动作都要调用perform执行 # 点击摁住源图片 ActionChains(driver).click_and_hod(draggable).perform() s=0 while s < distance: # 执行位移操作 ActionChains(driver).move_by_offset(xoffset=2,yoffset=0) s+=2 # 释放动作链 ActionChains(driver).release().perform() time.sleep(10) finally: driver.close() ''' 前进、后退 ''' from selenium import webdriver import time driver = webdriver.Chrome() try: driver.implicitly_wait(10) driver.get('https://www.jd.com/') driver.get('https://www.baidu.com/') driver.get('https://www.cnblogs.com/') time.sleep(2) # 回退操作 driver.back() time.sleep(1) # 前进操作 driver.forward() time.sleep(1) driver.back() time.sleep(10) finally: driver.close()
步骤:
1、打开文件的查看,显示隐藏文件
2、找到C:\Users\administortra\AppData\Local\Google\Chrome\User Data
删除Default文件
3、重新打开浏览器,并登陆百度账号
- 此时会创建一个新的Default缓存文件
4 添加cookies
5 关闭谷歌浏览器后执行程序
'''
from selenium import webdriver from selenium.webdriver import ChromeOptions import time # 获取options对象,参数对象 options = ChromeOptions() # 获取cookies保存路径 # 'C:\Users\administortra\AppData\Local\Google\Chrome\User Data' profile_directory = r'--user-data-dir=C:\Users\administortra\AppData\Local\Google\Chrome\User Data' # 添加用户信息目录 options.add_argument(profile_directory) # 把参数加载到当前驱动中 chrome_options默认参数,用来接收options对象 driver = webdriver.Chrome(chrome_options=options) try: driver.implicitly_wait(10) driver.get('https://www.baidu.com/') ''' BDUSS:***** ''' # 添加用户cookies信息 # name、value必须小写 driver.add_cookie({"name": "BDUSS", "value": "用户session字符串"}) # 刷新操作 driver.refresh() time.sleep(10) finally: driver.close()
''''''
'''
爬取京东商品信息:
请求url: https://www.jd.com/
提取商品信息:1.商品详情页 2.商品名称 3.商品价格 4.评价人数 5.商品商家
'''
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver=webdriver.Chrome() try: driver.implicitly_wait(10) # 1、往京东主页发送请求 driver.get('https://www.jd.com/') # 2、输入商品名称,并回车搜索 input_tag = driver.find_element_by_id('key') input_tag.send_keys('macbook') input_tag.send_keys(Keys.ENTER) time.sleep(2) # 通过JS控制滚轮滑动获取所有商品信息 js_code = ''' window.scrollTo(0,5000); ''' driver.execute_script(js_code) # 执行js代码 # 等待数据加载 time.sleep(2) # 3、查找所有商品div # good_div = driver.find_element_by_id('J_goodsList') good_list = driver.find_elements_by_class_name('gl-item') n = 1 for good in good_list: # 根据属性选择器查找 # 商品链接 good_url = good.find_element_by_css_selector( '.p-img a').get_attribute('href') # 商品名称 good_name = good.find_element_by_css_selector( '.p-name em').text.replace("\n", "--") # 商品价格 good_price = good.find_element_by_class_name( 'p-price').text.replace("\n", ":") # 评价人数 good_commit = good.find_element_by_class_name( 'p-commit').text.replace("\n", " ") # 商品商家 good_from = good.find_element_by_class_name( 'J_im_icon').text.replace("\n", " ") good_content = f''' 商品链接: {good_url} 商品名称: {good_name} 商品价格: {good_price} 评价人数: {good_commit} 商品商家: {good_from} \n ''' print(good_content) with open('jd.txt', 'a', encoding='utf-8') as f: f.write(good_content) next_tag = driver.find_element_by_link_text('下一页') next_tag.click() time.sleep(10) finally: driver.close()
1 from selenium import webdriver 2 from selenium.webdriver.common.keys import Keys 3 import time 4 5 6 def get_good(driver): 7 try: 8 9 # 通过JS控制滚轮滑动获取所有商品信息 10 js_code = ''' 11 window.scrollTo(0,5000); 12 ''' 13 driver.execute_script(js_code) # 执行js代码 14 15 # 等待数据加载 16 time.sleep(2) 17 18 # 3、查找所有商品div 19 # good_div = driver.find_element_by_id('J_goodsList') 20 good_list = driver.find_elements_by_class_name('gl-item') 21 n = 1 22 for good in good_list: 23 # 根据属性选择器查找 24 # 商品链接 25 good_url = good.find_element_by_css_selector( 26 '.p-img a').get_attribute('href') 27 28 # 商品名称 29 good_name = good.find_element_by_css_selector( 30 '.p-name em').text.replace("\n", "--") 31 32 # 商品价格 33 good_price = good.find_element_by_class_name( 34 'p-price').text.replace("\n", ":") 35 36 # 评价人数 37 good_commit = good.find_element_by_class_name( 38 'p-commit').text.replace("\n", " ") 39 40 good_content = f''' 41 商品链接: {good_url} 42 商品名称: {good_name} 43 商品价格: {good_price} 44 评价人数: {good_commit} 45 \n 46 ''' 47 print(good_content) 48 with open('jd.txt', 'a', encoding='utf-8') as f: 49 f.write(good_content) 50 51 next_tag = driver.find_element_by_class_name('pn-next') 52 next_tag.click() 53 54 time.sleep(2) 55 56 # 递归调用函数 57 get_good(driver) 58 59 time.sleep(10) 60 61 finally: 62 driver.close() 63 64 65 if __name__ == '__main__': 66 67 good_name = input('请输入爬取商品信息:').strip() 68 69 driver = webdriver.Chrome() 70 driver.implicitly_wait(10) 71 # 1、往京东主页发送请求 72 driver.get('https://www.jd.com/') 73 74 # 2、输入商品名称,并回车搜索 75 input_tag = driver.find_element_by_id('key') 76 input_tag.send_keys(good_name) 77 input_tag.send_keys(Keys.ENTER) 78 time.sleep(2) 79 80 get_good(driver)
'''
破解极验滑动验证
博客园登录url:
https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
1、输入用户名与密码,并点击登录
2、弹出滑动验证,获取有缺口与完整的图片
3、通过像素点进行比对,获取滑动位移距离
4、模拟人的行为轨迹
5、开始滑动
'''
1 from selenium import webdriver # 用来驱动浏览器的 2 from selenium.webdriver import ActionChains # 破解滑动验证码的时候用的 可以拖动图片 3 import time 4 from PIL import Image # pip3 install pillow 5 import random 6 7 option = webdriver.ChromeOptions() 8 option.add_argument('disable-infobars') 9 10 driver = webdriver.Chrome(chrome_options=option) 11 12 13 def get_snap(driver): 14 # selenium自带的截图网页全屏图片 15 driver.save_screenshot('snap.png') 16 17 img = driver.find_element_by_class_name('geetest_canvas_img') 18 19 left = img.location['x'] 20 21 upper = img.location['y'] 22 23 right = left + img.size['width'] 24 lower = upper + img.size['height'] 25 26 # print(left, upper, right, lower) 27 img_obj = Image.open('snap.png') 28 29 # 对屏幕进行截取,获取滑动验证图片 30 image = img_obj.crop((left, upper, right, lower)) 31 32 return image 33 34 35 def get_image1(driver): 36 time.sleep(0.2) 37 js_code = ''' 38 var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block"; 39 console.log(x) 40 ''' 41 42 time.sleep(1) 43 driver.execute_script(js_code) 44 45 # 截取图片 46 img_obj = get_snap(driver) 47 48 return img_obj 49 50 51 def get_image2(driver): 52 time.sleep(0.2) 53 54 js_code = ''' 55 var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="none"; 56 console.log(x) 57 ''' 58 59 driver.execute_script(js_code) 60 61 time.sleep(1) 62 63 # 截取图片 64 img_obj = get_snap(driver) 65 66 return img_obj 67 68 69 def get_distance(image1, image2): 70 # 初始值 71 start = 60 72 73 # 滑块色差 74 color_num = 60 75 76 for x in range(start, image1.size[0]): 77 for y in range(image1.size[1]): 78 79 rgb1 = image1.load()[x, y] 80 81 rgb2 = image2.load()[x, y] 82 83 r = abs(rgb1[0] - rgb2[0]) 84 g = abs(rgb1[1] - rgb2[1]) 85 b = abs(rgb1[2] - rgb2[2]) 86 87 if not (r < color_num and g < color_num and b < color_num): 88 return x - 7 89 90 91 def get_stacks(distance): 92 distance += 20 93 94 ''' 95 匀加速\减速运行 96 v = v0 + a * t 97 98 位移: 99 s = v * t + 0.5 * a * (t**2) 100 ''' 101 102 # 初速度 103 v0 = 0 104 105 # 加减速度列表 106 a_list = [3, 4, 5] 107 108 # 时间 109 t = 0.2 110 111 # 初始位置 112 s = 0 113 114 # 向前滑动轨迹 115 forward_stacks = [] 116 117 mid = distance * 3 / 5 118 119 while s < distance: 120 if s < mid: 121 a = a_list[random.randint(0, 2)] 122 123 else: 124 a = -a_list[random.randint(0, 2)] 125 126 v = v0 127 128 stack = v * t + 0.5 * a * (t ** 2) 129 130 # 每次拿到的位移 131 stack = round(stack) 132 133 s += stack 134 135 v0 = v + a * t 136 137 forward_stacks.append(stack) 138 139 back_stacks = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1] 140 141 return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks} 142 143 144 def main(): 145 try: 146 147 driver.get('https://passport.cnblogs.com/user/signin') 148 driver.implicitly_wait(5) 149 150 # 1.输入用户名与密码,点击登录 151 username = driver.find_element_by_id('LoginName') 152 password = driver.find_element_by_id('Password') 153 login_button = driver.find_element_by_class_name('ladda-label') 154 time.sleep(1) 155 username.send_keys('_tank_') 156 time.sleep(1) 157 password.send_keys('k46709394.') 158 159 # 这里需要等待账号密码输入完毕后再点击登录按钮,否则的不弹框 160 time.sleep(1) 161 login_button.click() 162 # time.sleep(3) 163 164 # 2.点击滑动验证按钮,获取图片 165 geetest_button = driver.find_element_by_class_name('geetest_slider_button') 166 geetest_button.click() 167 168 time.sleep(0.2) 169 170 # 3.针对完整的图片进行截取 171 image1 = get_image1(driver) 172 173 # 4.针对有缺口的图片进行截取 174 image2 = get_image2(driver) 175 176 # 5.对比两张图片,获取滑动距离 177 distance = get_distance(image1, image2) 178 179 # 6.模拟人为滑动轨迹 180 stacks = get_stacks(distance) 181 182 # 7.根据滑动轨迹进行滑动 183 forward_stacks = stacks['forward_stacks'] 184 back_stacks = stacks['back_stacks'] 185 186 slider_button = driver.find_element_by_class_name('geetest_slider_button') 187 time.sleep(0.2) 188 189 ActionChains(driver).click_and_hold(slider_button).perform() 190 191 time.sleep(0.2) 192 for forward_stack in forward_stacks: 193 ActionChains(driver).move_by_offset(xoffset=forward_stack, yoffset=0).perform() 194 time.sleep(0.1) 195 for back_stack in back_stacks: 196 ActionChains(driver).move_by_offset(xoffset=back_stack, yoffset=0).perform() 197 time.sleep(0.1) 198 199 time.sleep(0.2) 200 201 ActionChains(driver).move_by_offset(xoffset=5, yoffset=0).perform() 202 ActionChains(driver).move_by_offset(xoffset=-5, yoffset=0).perform() 203 204 ActionChains(driver).release().perform() 205 206 time.sleep(50) 207 208 209 finally: 210 driver.close() 211 212 213 if __name__ == '__main__': 214 main()
转载于:https://www.cnblogs.com/feiyufei/p/11048226.html