请求库-selenium 模块
# -*- coding: utf-8 -*- # 安装:pip3 install selenium # 下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是3.5
# 国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/3.5
# 最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads # 验证安装
from selenium import webdriver
# driver = webdriver.Chrome() #弹出浏览器
# driver.get("https://www.baidu.com") #浏览器自动访问该url
# print(driver.page_source) #终端打印获取到的urltext文件 # 安装:pip3 install selenium
# 下载phantomjs,解压后把phantomjs.exe所在的bin目录放到环境变量
# 下载链接:http://phantomjs.org/download.html # drivers = webdriver.PhantomJS(executable_path=r"E:\python\phantomjs-2.1.1-windows\bin\phantomjs.exe") #无界面浏览器
# 环境变量配置之后就可以不用加里面的参数,但是不知道什么原因pycharm识别不了,只能手动吧目录填写进去
# drivers.get('https://www.baidu.com')
# print(drivers.page_source) # 基本使用
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #查找方式:ID,class
from selenium.webdriver.common.keys import Keys #键盘操作,enter
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser = webdriver.Chrome()
try:
browser.get("https://www.baidu.com") #访问这个页面
input_tag = browser.find_element_by_id("kw") #找到搜索框ID
input_tag.send_keys("极致诱惑") #给搜索框添加搜索条件
input_tag.send_keys(Keys.ENTER) #模仿人手动敲击回车键
wait = WebDriverWait(browser,10) #等待10秒
wait.until(EC.presence_of_element_located((By.ID,"content_left--"))) #等待十秒,知道等到content_left--加载出来, print("browser.page_source",browser.page_source)
print("browser.current_url",browser.current_url)
print("browser.get_cookie()",browser.get_cookie) finally:
browser.close() #最后得关闭
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
wait = WebDriverWait(driver,5) try:
# ===============所有方法===================
# 1、find_element_by_id
# 2、find_element_by_link_text
# 3、find_element_by_partial_link_text
# 4、find_element_by_tag_name
# 5、find_element_by_class_name
# 6、find_element_by_name
# 7、find_element_by_css_selector
# 8、find_element_by_xpath
###############################################################
# 1、find_element_by_id
# print(driver.find_element_by_id("kw"))
# 2、find_element_by_link_text
# login = driver.find_elements_by_link_text("登录")[0]
# login.click()
# 3、find_element_by_partial_link_text
login = driver.find_elements_by_partial_link_text("录")[0]
login.click()
# 4、find_element_by_tag_name
# print(driver.find_element_by_tag_name("a"))
# 5、find_element_by_class_name
button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))
button.click()
print("============")
# 6、find_element_by_name
input_user = wait.until(EC.presence_of_element_located((By.NAME,"userName")))
input_pwd = wait.until(EC.presence_of_element_located((By.NAME,"password")))
commit = wait.until(EC.element_to_be_clickable((By.ID,"TANGRAM__PSP_10__submit"))) input_user.send_keys("xxxxxxxxx") #输入框输入用户名
input_pwd.send_keys("xxxxxxxxx") #密码框输入密码
commit.click()
time.sleep(4) finally:
driver.close()
自动登录百度账号
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time driver = webdriver.Chrome()
driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
driver.implicitly_wait(3) #有些文件加载比较缓慢,在加载之前等待 try:
driver.find_element_by_xpath("//a") #从根目录下找子子孙孙,找不到报错
# driver.find_element_by_xpath("//body/a") #从根目录body先找他的儿子,找不到爆粗
driver.find_element_by_xpath("//body//a") #从body下的子子孙孙找a,
res1 = driver.find_element_by_xpath("//body//a[3]") # 取第一个a标签,标签按1开始
print(res1.text)
r2 = driver.find_element_by_xpath("//a[3]")
print(r2.text)
r3 = driver.find_element_by_xpath('//*[@id="images"]/a[3]')
print(r3.text)
# r1,r2,r3 的结果是相同的
res4 = driver.find_elements_by_xpath("/html/body/div/a")[3]
print(res4.text)
res5 = driver.find_element_by_xpath('//a[img/@src="data:image3_thumb.jpg"]')
print(res5.text) finally:
driver.close()
xpath的基本使用
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
browser = webdriver.Chrome()
browser.get("https://www.amazon.cn")
wait = WebDriverWait(browser,10)
wait.until(EC.presence_of_all_elements_located((By.ID,"cc-lm-tcgShowImgContainer")))
tag = browser.find_element(By.CSS_SELECTOR,"#cc-lm-tcgShowImgContainer img")
print(tag.get_attribute("src"))
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)
browser.close()
获取标签属性
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys # 键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
import time
driver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
# wait = WebDriverWait(driver,3)
driver.implicitly_wait(3)
try:
driver.switch_to.frame("iframeResult")
drop = driver.find_element_by_id("droppable") #不懂
drag = driver.find_element_by_id("draggable") #动
# 移动方块
# 方式一:
# actions = ActionChains(driver) #拿到动作连对象
# actions.drag_and_drop(drop,drag)
# actions.perform()
# time.sleep(4)
# 方式二
ActionChains(driver).click_and_hold(drag).perform()
distance = drop.location["x"] - drag.location["x"] #获取到两者之间的距离
track = 0
while track < distance:
ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
track +=2
ActionChains(driver).release().perform()
time.sleep(10)
finally:
driver.close()
actionchains
等待元素加载
#1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待 #2、等待的方式分两种:
隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome() #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10) browser.get('https://www.baidu.com') input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER) contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
print(contents) browser.close()
隐式等待
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser=webdriver.Chrome()
browser.get('https://www.baidu.com') input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER) #显式等待:显式地等待某个元素被加载
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left'))) contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents) browser.close()
显示等待
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
wait = WebDriverWait(browser,10)
# input_tag = browser.find_element_by_id("q")
# input_tag.send_keys("情趣用品")
# button = browser.find_element_by_class_name("btn-search")
# button.click()
input_tag = wait.until(EC.presence_of_element_located((By.ID,"q")))
input_tag.send_keys("情趣用品")
button = wait.until(EC.presence_of_element_located((By.CLASS_NAME,"btn-search")))
button.click() import time
time.sleep(3)
input_tag = browser.find_element_by_id("q")
input_tag.clear()
input_tag.send_keys("iphone9")
button = browser.find_element_by_class_name("btn-search")
button.click()
自动搜索,二次跳转
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 try:
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.execute_script("alert(6666)")
import time
time.sleep(3)
finally:
browser.close()
手动写js
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素 #frame相当于一个单独的网页,在父frame里是无法直接查看到子frame的元素的,必须switch_to_frame切到该frame下,才能进一步查找
try:
browser = webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame("iframeResult")
tag1 = browser.find_element_by_id("droppable")
print(tag1)
browser.switch_to.parent_frame()
tag2 = browser.find_element_by_id("textareaCode")
print(tag2)
finally:
browser.close() # 先切换到iframe里找标签,然后切换到父母版中找标签
iframe切换问题
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.get("https://www.taobao.com")
browser.get("https://www.sina.com.cn/") browser.back() #后退
time.sleep(12)
browser.forward() # 前进
time.sleep(12)
browser.close() # 访问顺序;首先访问百度,淘宝,新浪,然后返回淘宝,12秒后前进到新浪,12秒后关闭浏览器
模拟浏览器前进后退
#cookies
# from selenium import webdriver
#
# browser=webdriver.Chrome()
# browser.get('https://www.zhihu.com/explore')
# print(browser.get_cookies())
# browser.add_cookie({'k1':'xxx','k2':'yyy'})
# print(browser.get_cookies())
#
# # browser.delete_all_cookies()
cookie操作
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.execute_script("window.open()")
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])
browser.get("https://www.taobao.com")
time.sleep(10)
browser.switch_to.window(browser.window_handles[0])
browser.get("https://www.sina.com.cn")
browser.close()
# 先访问百度页面,然后打开新的选项卡,跳转到新的选项卡,访问淘宝,10秒后跳转到第一个选项卡,访问新浪,关闭
选项卡切换操作
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException try:
browser=webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframssseResult') except TimeoutException as e:
print(e)
except NoSuchFrameException as e:
print(e)
finally:
browser.close()
异常处理
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
import time def get_good(driver):
try:
goods = driver.find_elements_by_class_name("gl-item")
for good in goods: # 循环着一夜的的数据
detail_url = good.find_element_by_tag_name("a").get_attribute("href") #商品详情
detail_price = good.find_element_by_css_selector(".p-price i").text #商品价格
detail_name = good.find_element_by_css_selector(".p-name em").text #商品名
detail_com = good.find_element_by_css_selector(".p-commit a").text #评论量
msg = """
商品名:%s
详情链接:%s
商品价格:%s
评论量:%s
"""%(detail_name,detail_url,detail_price,detail_com)
print(msg)
# 这里可以写入文件操作
button = driver.find_element_by_partial_link_text('下一页') #检测到右下一页链接
button.click()
time.sleep(2)
get_good(driver) # 睡两秒后继续爬,爬的太快容易被服务器检测到
except Exception:
pass def spilder(url,keyword):
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(7)
try:
input_tag = driver.find_element_by_id("key")
input_tag.send_keys(keyword)
input_tag.send_keys(Keys.ENTER)
get_good(driver)
finally:
driver.close() if __name__ == '__main__':
spilder("https:www.jd.com","情趣")
爬取京东商品
# -*- coding: utf-8 -*- from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
from PIL import Image #pip3 install pillow import time def get_snap(driver):
'''
:param driver:
:return: 返回屏幕的全图
'''
driver.save_screenshot("snap.png")
snap_obj = Image.open("snap.png")
# snap_obj.show()
return snap_obj def get_image(driver):
'''
:param driver:
:return:返回验证图片的全图
'''
img = driver.find_element_by_class_name("geetest_canvas_img")
time.sleep(2)
size = img.size #获取到图片大小
location = img.location #获取到图片的相对位置 left = location["x"]
top = location["y"]
right = left + size["width"]
bottom = top + size["height"]
# print(left,top,right,bottom) snap_obj = get_snap(driver)
image_obj = snap_obj.crop((left,top,right,bottom)) #截取全部中的坐标图片
# image_obj.show()
return image_obj def get_distance(image1,image2):
start_x = 58 # 图片的x轴起始位置
threhold = 60 # 误差的阀值
for x in range(start_x, image1.size[0]):
for y in range(image1.size[1]): # x,y 是他们额像素点
rgb1 = image1.load()[x, y] # 获取第一张图片的像素点
rgb2 = image2.load()[x, y] # 获取第二张图片的像素点
res1 = abs(rgb1[0] - rgb2[0])
res2 = abs(rgb1[1] - rgb2[1])
res3 = abs(rgb1[2] - rgb2[2])
if not (res1 < threhold and res2 < threhold and res3 < threhold):
return x - 7 def get_tracks(distance):
distance += 20 # 滑动距离+20 →欺骗服务器
v0 = 0
s = 0
t = 0.2
mid = distance*3/5
forward_tracks = []
while s < distance:
if s < mid:
a=2
else:
a=-3
v = v0
track = v*t+0.5*a*(t**2)
track = round(track) # 四舍五入
v0 = v + a*t
s+=track
forward_tracks.append(track) # 移动轨迹
back_tracks = [-1, -1, -1, -2, -2, -2, -3, -3, -2, -2, -1] # 多加的20个单位
return {"forward_tracks":forward_tracks,"back_tracks":back_tracks} def slice(url,username,password):
try:
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(3) # 1、输入账号,密码,点击登录
input_user = driver.find_element_by_id("input1")
input_pwd = driver.find_element_by_id("input2")
login_user = driver.find_element_by_id("signin")
input_user.send_keys(username)
input_pwd.send_keys(password)
login_user.click() # 2、 点击按钮,出现验证码图片(完整的图)
geetest_radar_tip = driver.find_element_by_class_name("geetest_radar_tip")
geetest_radar_tip.click() # 3、针对没有缺口的图片截图
image1 = get_image(driver) # 4、点击滑动按钮,出现残缺的图片
slider_button = driver.find_element_by_class_name("geetest_slider_button")
slider_button.click() # 5、针对有缺口的图片截图
image2 = get_image(driver) # 6、对比两张图片,找出缺口,就是滑动的2唯一
distance = get_distance(image1, image2) # 获取到图片的位移信息 # 7、按照人的行为习惯,把总位移切成小的位移
track_dic = get_tracks(distance) # 8、 按照位移移动图片
slider_button = driver.find_element_by_class_name("geetest_slider_button") # 找到按钮
ActionChains(driver).click_and_hold(slider_button).perform() # 摁住它 forward_tracks = track_dic["forward_tracks"] # 前进的距离
back_tracks = track_dic["back_tracks"] # 后退的距离(刚开始给distance+=20)
print(forward_tracks, back_tracks)
for forward_track in forward_tracks:
ActionChains(driver).move_by_offset(xoffset=forward_track, yoffset=0).perform() # 移动增加的距离
time.sleep(0.3) # 睡0.3秒模仿人动作延迟 # print("==================================>")
for back_track in back_tracks: # 后退的距离
ActionChains(driver).move_by_offset(xoffset=back_track, yoffset=0).perform() ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() # 最终抖一抖
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform() # 抖一抖
time.sleep(0.3)
ActionChains(driver).release().perform() # 释放
time.sleep(2) except Exception:
pass finally:
driver.close() if __name__ == '__main__':
url = "https://passport.cnblogs.com/user/signin"
username = "username"
password = "password"
slice(url,username,password)
自动登录博客园
请求库-selenium 模块的更多相关文章
- 关于python请求库Selenium安装所遇到的问题
今天,初次接触python,在网上买了一本关于爬虫的书,因为之前电脑上存在python,所以就对着书直接进行的请求库的安装,安装的时候,主要遇到了下边一个问题,在安装Selenium的时候,出现以下提 ...
- 爬虫请求库——selenium
selenium模块 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题.selenium的缺点是效率会变得很慢. sel ...
- 爬虫、请求库selenium
阅读目录 一 介绍 二 安装 三 基本使用 四 选择器 五 等待元素被加载 六 元素交互操作 七 其他 八 项目练习 一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决r ...
- 爬虫----爬虫请求库selenium
一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...
- selenium模块的基本使用
一.selenium库与requests库的区别 - selenium请求库: - 本质上是一个自动化测试模块; ---> 主要用于测试 UI界面 - selenium除了可以做自动化测试,还可 ...
- 02 请求库之 selenium模块
selenium模块 一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动 ...
- Selenium请求库
阅读目录 一 介绍 二 安装 三 基本使用 四 等待元素被加载 五 选择器 六 元素交互操作 七 其他 八 项目练习 九 破解登录验证 一 介绍 1.selenium是什么? selenium最初是一 ...
- 爬虫(二)—— 请求库(二)selenium请求库
目录 selenium请求库 一.什么是selenium 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.显示等待与隐式等待 ...
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...
随机推荐
- 《Head First 设计模式》【PDF】下载
<Head First 设计模式>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196307 First 设计模式>[PDF] ...
- 函数的非固定参数-Day3
一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...
- 一个APP页面一个接口
目前所在的公司做的是健康产业方面的APP,这个产品包括了安卓和IOS还有web三方面,除了要写后台管理的系统外,还要写移动端的接口.第一次写移动端接口就犯了一个错误,以为和web一样是怎么方便怎么来, ...
- Docker安装入门 -- 中间件镜像
Docker安装入门 -- 中间件镜像 php-fpm 1.docker build -t csphere/php-fpm:5.4 . //在当前目录下创建镜像 2.docker run -d - ...
- Elasticsearch索引自动删除
简介 脚本分2部分,1部分查找符合条件的索引名,2脚本调用1脚本,进行删除操作 脚本 查找符合条件的,默认大于30天 # coding:utf-8 __author__ = 'Jipu FANG' f ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- mysql zip 版安装
http://jingyan.baidu.com/article/8cdccae946133f315513cd6a.html
- 【自问自答】关于 Swift 的几个疑问
感觉自己给自己释疑,也是一个极为有趣的过程.这次,我还新增了"猜想"一栏,来尝试回答一些暂时没有足够资料支撑的问题. Swift 版本是:4.0.3.不同版本的 Swift,可能无 ...
- Xamarin.android 重写axml控件
https://www.cnblogs.com/lonelyxmas/p/5632694.html <Laco: 用来用引指定的控件 android:layout_widt ...
- PHP生成验证码
<?php check_code(); function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') { $ ...