selenium操作

  点击、清除操作

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time driver = webdriver.Chrome( ) 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()

  获取cookies

from selenium import webdriver
import time
driver = webdriver.Chrome()
try:
driver.implicitly_wait(10)
driver.get('https://www.zhihu.com/explore')
print(driver.get_cookies())
time.sleep(10)
finally:
driver.close()

  选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:

import time
from selenium import webdriver
#
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
#
execute_script: 执行javascrpit代码
#弹窗操作
browser.execute_script('alert("tank")')
#新建浏览器窗口
browser.execute_script(
'''
window.open();
'''
)
time.sleep(1)
print(browser.window_handles) 获取所有的选项卡
#切换到第二个窗口
#新:
browser.switch_to.window(browser.window_handles[1])
#旧:
#browser.switch_to_window(browser.window_handles[1])
# 第二个窗口往淘宝发送请求
browser.get('https://www.taobao.com')
time.sleep(5) #切换到第一个窗口
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn') time.sleep(10)
finally:
browser.close()

  ActionChangs动作链

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
#
driver = webdriver.Chrome()
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.switch_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_hold(draggable).perform()
s = 0
while s < distance:
#执行位移操作
ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()
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、关闭谷歌浏览器后执行程序

# 获取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)
from selenium import webdriver
from selenium.webdriver import ChromeOptions
import time
# 把参数加载到当前驱动中 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.评价人数

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time def get_good(driver):
try: # 通过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_content = f'''
商品链接: {good_url}
商品名称: {good_name}
商品价格: {good_price}
评价人数: {good_commit}
\n
'''
print(good_content)
with open('jd.txt', 'a', encoding='utf-8') as f:
f.write(good_content) next_tag = driver.find_element_by_class_name('pn-next')
next_tag.click() time.sleep(2) # 递归调用函数
get_good(driver) time.sleep(10) finally:
driver.close() if __name__ == '__main__': good_name = input('请输入爬取商品信息:').strip() driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 1、往京东主页发送请求
driver.get('https://www.jd.com/') # 2、输入商品名称,并回车搜索
input_tag = driver.find_element_by_id('key')
input_tag.send_keys(good_name)
input_tag.send_keys(Keys.ENTER)
time.sleep(2) get_good(driver)

破解滑动验证

  破解极验滑动验证  
    博客园登录url:
     https://account.cnblogs.com/signinreturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
    1、输入用户名与密码,并点击登录
    2、弹出滑动验证,获取有缺口与完整的图片
    3、通过像素点进行比对,获取滑动位移距离
    4、模拟人的行为轨迹
    5、开始滑动

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains # 破解滑动验证码的时候用的 可以拖动图片
import time
from PIL import Image # pip3 install pillow
import random option = webdriver.ChromeOptions()
option.add_argument('disable-infobars') driver = webdriver.Chrome(chrome_options=option) def get_snap(driver):
# selenium自带的截图网页全屏图片
driver.save_screenshot('snap.png') img = driver.find_element_by_class_name('geetest_canvas_img') left = img.location['x'] upper = img.location['y'] right = left + img.size['width']
lower = upper + img.size['height'] # print(left, upper, right, lower)
img_obj = Image.open('snap.png') # 对屏幕进行截取,获取滑动验证图片
image = img_obj.crop((left, upper, right, lower)) return image def get_image1(driver):
time.sleep(0.2)
js_code = '''
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block";
console.log(x)
''' time.sleep(1)
driver.execute_script(js_code) # 截取图片
img_obj = get_snap(driver) return img_obj def get_image2(driver):
time.sleep(0.2) js_code = '''
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="none";
console.log(x)
''' driver.execute_script(js_code) time.sleep(1) # 截取图片
img_obj = get_snap(driver) return img_obj def get_distance(image1, image2):
# 初始值
start = 60 # 滑块色差
color_num = 60 for x in range(start, image1.size[0]):
for y in range(image1.size[1]): rgb1 = image1.load()[x, y] rgb2 = image2.load()[x, y] r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2]) if not (r < color_num and g < color_num and b < color_num):
return x - 7 def get_stacks(distance):
distance += 20 '''
匀加速\减速运行
v = v0 + a * t 位移:
s = v * t + 0.5 * a * (t**2)
''' # 初速度
v0 = 0 # 加减速度列表
a_list = [3, 4, 5] # 时间
t = 0.2 # 初始位置
s = 0 # 向前滑动轨迹
forward_stacks = [] mid = distance * 3 / 5 while s < distance:
if s < mid:
a = a_list[random.randint(0, 2)] else:
a = -a_list[random.randint(0, 2)] v = v0 stack = v * t + 0.5 * a * (t ** 2) # 每次拿到的位移
stack = round(stack) s += stack v0 = v + a * t forward_stacks.append(stack) back_stacks = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1] return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks} def main():
try: driver.get('https://passport.cnblogs.com/user/signin')
driver.implicitly_wait(5) # 1.输入用户名与密码,点击登录
username = driver.find_element_by_id('LoginName')
password = driver.find_element_by_id('Password')
login_button = driver.find_element_by_class_name('ladda-label')
time.sleep(1)
username.send_keys('_tank_')
time.sleep(1)
password.send_keys('k46709394.') # 这里需要等待账号密码输入完毕后再点击登录按钮,否则的不弹框
time.sleep(1)
login_button.click()
# time.sleep(3) # 2.点击滑动验证按钮,获取图片
geetest_button = driver.find_element_by_class_name('geetest_slider_button')
geetest_button.click() time.sleep(0.2) # 3.针对完整的图片进行截取
image1 = get_image1(driver) # 4.针对有缺口的图片进行截取
image2 = get_image2(driver) # 5.对比两张图片,获取滑动距离
distance = get_distance(image1, image2) # 6.模拟人为滑动轨迹
stacks = get_stacks(distance) # 7.根据滑动轨迹进行滑动
forward_stacks = stacks['forward_stacks']
back_stacks = stacks['back_stacks'] slider_button = driver.find_element_by_class_name('geetest_slider_button')
time.sleep(0.2) ActionChains(driver).click_and_hold(slider_button).perform() time.sleep(0.2)
for forward_stack in forward_stacks:
ActionChains(driver).move_by_offset(xoffset=forward_stack, yoffset=0).perform()
time.sleep(0.1)
for back_stack in back_stacks:
ActionChains(driver).move_by_offset(xoffset=back_stack, yoffset=0).perform()
time.sleep(0.1) time.sleep(0.2) ActionChains(driver).move_by_offset(xoffset=5, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-5, yoffset=0).perform() ActionChains(driver).release().perform() time.sleep(50) finally:
driver.close() if __name__ == '__main__':
main()

Python Learning Day6的更多相关文章

  1. python笔记 - day6

    python笔记 - day6 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 大纲: 利用递归,实现阶乘: Python反射 pyt ...

  2. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  3. Python Learning Paths

    Python Learning Paths Python Expert Python in Action Syntax Python objects Scalar types Operators St ...

  4. Python Learning

    这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...

  5. python基础 Day6

    python Day6 id 可以获得python的内存地址 id的举例子 a=100 print(id(a)) #140712544153072 这里就是该对象的内存地址 is 判断的是比较内存地址 ...

  6. How to begin Python learning?

    如何开始Python语言学习? 1. 先了解它,Wiki百科:http://zh.wikipedia.org/zh-cn/Python 2. Python, Ruby等语言来自开源社区,社区的学法是V ...

  7. python 学习day6(面向对象)

    博客部分内容转自:http://www.cnblogs.com/wupeiqi/p/4493506.html 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法 ...

  8. Experience of Python Learning Week 1

    1.The founder of python is Guido van Rossum ,he created it on Christmas in 1989, smriti of ABC langu ...

  9. Python Learning: 03

    An inch is worth a pound of gold, an inch of gold is hard to buy an inch of time. Slice When the sca ...

随机推荐

  1. IOS pin约束问题 存在间隙

    今天在为自己的view添加约束 对比以前添加的约束时,发现有有两层淡红色线框一条实线和一条虚线,而以前一个demo中添加的则只有一个蓝色实线框. 今天添加的约束如图1所示: 图1 而以前添加约束如图2 ...

  2. NO18 linux开机自启动设置--开机流程--中文乱码--查看行数

    第八题:装完系统后,希望让网络文件共享服务NES,仅在3级别上开机自启动,该如何做? 解答:什么是开机自启动,在Linux下软件服务随系统启动而启动的配置. 方法一:文件配置法,可以把要启动的服务的命 ...

  3. P1090 危险品装箱

    1090 危险品装箱 (25分)   集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你 ...

  4. 四篇关于chen_zhe的美文

    壹   chen_zhe人 那是谁 是谁 是谁 那就是 chen_zhe chen_zhe人 chen_zhe人 背负着暴政之名 抛弃了一切(指民心)而战斗(指禁言)的男人 chen_zhe代码是超音 ...

  5. Unable to execute dex:Multuple dex files define 解决方法

    困扰我两天的问题终于解决了,在网上查的方法无非有三种 一. Eclipse->Project->去掉Build Automatically->Clear ->Build Pro ...

  6. MQTT 协议学习:004-MQTT建立通信与 CONNECT 、CONNACK 报文

    背景 上一讲 MQTT 协议学习:通信报文的构成介绍了在MQTT通信中,各报文的通信流程:从本讲开始,我们开始介绍实际中使用的报文,以及它们的组成. CONNECT - 连接请求 报文 客户端到服务端 ...

  7. use matplotlib to draw scatter plot

    There are many pionts in this kind of table. How to do it? We can use scatter() to draw it. Code: im ...

  8. Js获取页面地址参数

    var url = window.location.href; //获取当前窗口的Url; 结果:http://localhost:61768/Home/Index?id=2&age=18 v ...

  9. Golang的运算符-位运算符

    Golang的运算符-位运算符 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算符概述 常见的位逻辑运算符: &: 位与运算符,表示AND(表示所有条件都得匹配), ...

  10. Live555 的一个缺陷–例子不能支持多线程(已经修改成支持多线程)

    我对Live555进行了一次封装,但是Live555 是单线程的,里面定义的全局变量太多,我封装好dll库后,在客户端调用,因为多个对话框中要使用码流,我就定义了多个对象从设备端接收码流,建立多个连接 ...