Python(七十四)selenium进阶
2022-03-05 本文已影响0人
Lonelyroots
13_selenium进阶/01_selenium动作.py:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains # 导入动作链
import time
browser = webdriver.Chrome()
browser.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
browser.switch_to.frame("iframeResult")
div = browser.find_element(By.ID,'draggable')
# 动作链
action = ActionChains(browser)
action.click_and_hold(div) # 点击且长按指定标签
for i in range(5):
# # def move_by_offset(self, xoffset, yoffset): # 拖动目标到指定位置
# action.move_by_offset(50,2).perform()
# def drag_and_drop_by_offset(self, source, xoffset, yoffset): # 拖动目标到指定位置,并放开
action.drag_and_drop_by_offset(div,50,2).perform()
time.sleep(0.3)
# 释放动作链
action.release()
time.sleep(5)
print(div)
browser.close()
13_selenium进阶/02_selenium等待方式.py:
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
"""
第一种办法就是强制等待sleep(),需要导入time模块,这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒后,继续执行下面的的代码,
作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
"""
# # 强制等待
# time.sleep(3)
"""
第二种办法叫隐性等待,通过添加 implicitly_wait()方法就可以方便的实现智能等待;implicitly_wait(30)的用法应该比 time.sleep() 更智能
后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
"""
# # 隐性等待
# browser.implicitly_wait(30) # 最长等待时间30秒
browser.quit()
"""
有时候页面想要的元素早就加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,所以我想等我要的元素出来之后就执
行下一步
"""
13_selenium进阶/03_selenium显示等待.py:
"""
第三种方法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。
它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
"""
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
base_url = "www.baidu.com"
browser = webdriver.Chrome()
browser.get(base_url)
WebDriverWait(browser,10).until(EC.title_is("百度一下,你就知道"))
'''判断title,返回布尔值'''
WebDriverWait(browser,10).until(EC.title_contains("百度一下")) # 包含
'''判断title,返回布尔值'''
WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,'kw')))
'''判断某个元素是否被加到了dom树里(源码),并不代表该元素一定可见,如果定位到就返回WebElement'''
WebDriverWait(browser,10).until(EC.visibility_of_element_located((By.ID,'su')))
'''判断某个元素是否被加到了dom树里并且可见,可见:代表元素可显示且宽和高都大于0'''
13_selenium进阶/04_京东.py:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
import time
from lxml import etree
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
# 有界面
browser = webdriver.Chrome()
# # 无界面
# chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
# browser = webdriver.Chrome(chrome_options=chrome_options)
wait = WebDriverWait(browser,10)
browser.set_window_size(1400,900)
def search():
print('正在搜索')
try:
browser.get('https://www.jd.com/')
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#key'))) # 定位输入框
input.send_keys("笔记本") # 输入“笔记本”
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#search > div > div.form > button'))) # 定位搜索按钮
submit.click() # 点击搜索
time.sleep(2)
slide_loading() # 滑动页面拖条
endPage = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > em:nth-child(1) > b')))
get_products() # 获取数据
return endPage.text
except TimeoutException:
search()
def slide_loading(): # 滑动页面拖条
number = 400
for line in range(15):
js = "window.scrollTo(0,%s)" % number
number += 500
browser.execute_script(js)
time.sleep(5)
def get_products(): # 获取数据
html = browser.page_source # 拿到当前页面源码
tree = etree.HTML(html)
for li in tree.xpath('//ul[@class="gl-warp clearfix"]/li'):
print(li.xpath('.//div[@class="p-price"]//i/text()'), end='---')
print(li.xpath('.//div[@class="p-name p-name-type-2"]//em//text()'), end='---')
print(li.xpath('.//div[@class="p-commit"]//a/text()'), end='---')
print(li.xpath('.//div[@class="p-shop"]//a/text()'))
def flip(page_number):
print('当前页:', page_number)
try:
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > input')))
input.clear() # 清空当前内容
input.send_keys(page_number) # 往输入框输入页码
input.send_keys(Keys.ENTER) # 回车
slide_loading() # 滑动页面拖条
get_products() # 获取数据
except TimeoutException:
flip(page_number)
def run():
try:
end_Page = int(search())
for page in range(2,end_Page+1):
flip(page)
except Exception:
print("出错啦")
finally: # 不管有没有出现这个异常,最后都要执行下面的操作
browser.close()
if __name__ == '__main__':
run()
"""
search(),搜索
parse(),解析源码 获取数据
翻页 知道有多少页
滑动页面
"""
文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!
Editor:Lonelyroots