Python待用

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

上一篇下一篇

猜你喜欢

热点阅读