Learn python the sixth day

原文链接: http://www.cnblogs.com/feiyufei/p/11048226.html
'''
今日内容:
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()
View Code
步骤:
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()
View Code
''''''
'''
爬取京东商品信息:
请求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()
View Code
 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)
View Code
'''
破解极验滑动验证
博客园登录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()
View Code

转载于:https://www.cnblogs.com/feiyufei/p/11048226.html

猜你喜欢

转载自blog.csdn.net/weixin_30625691/article/details/94842783