美文网首页
Selenium小知识 - 等待

Selenium小知识 - 等待

作者: 今天也是努力的小张 | 来源:发表于2020-05-18 23:14 被阅读0次

一、整理selenium使用步骤

  1. 创建驱动对象
  2. 请求
  3. 等待
  4. 获取页面内容
    初识Selenium:有步骤1、2、4的解释

二、等待

1. 等待的目的

  • 等待就是让程序运行到这里等一会。
  • 人为点击页面会有请求的时间,如果使用代码请求浏览器运行速度很快,可能请求不到浏览器页面数据。
  • 等待的目的就是为了让浏览器能够请求结束,同时让page_sourse里面包含需求数据。

2. 等待的方法

(1)强制等待
import time
time.sleep(4)

特点:
操作简单,但是效率很低。

(2)隐式等待
# 20表示最大等待时间,20秒还没有请求成功(圈圈没有转完),就报“超时异常”
driver.implicitly_wait(20)

特点:

  • 等待到页面请求完毕:就是等到将HTML页面所有的数据加载完毕
  • 但是,页面中的广告或者图片加载很消耗时间,但是我们可能只需要包含数据的div
(3)显式等待

显式等待:等待到【特定一些页面元素】满足【某些条件】位置

from selenium.webdriver.support.wait import WebDriverWait   # 等待对象
from selenium.webdriver.support import expected_conditions  as EC   # 条件
from selenium.webdriver.common.by import By   # 定义定位器的常量


#(1)创建显示等待对象
# driver:表示显示等待对象监听到那个浏览器上
# 20:最大等待时长
wait = WebDriverWait(driver, 20)
#(2)等待
#presence_of_element_located(定位器):       # 等待定位器定位的元素出现内容
#presence_of_all_elements_located(定位器)         # 等待定位器定位的元素全部出现内容
#定位器:是一个元组(使用的定位语法,'对应语法的筛选路径')
res = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="root"]/div/div[2]/div[1]/div[1]/div')))
# print(res)    # webelement对象

特点:
弥补上面两种方法的缺点,但是记忆点较多

三、学习案例-豆瓣读书

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait   # 等待对象
from selenium.webdriver.support import expected_conditions as EC   # 条件
from selenium.webdriver.common.by import By   # 定义定位器的常量
from lxml import etree


def get_content_by_selenium(url):
    '''
    通过selenium获取页面内容
    :param url:
    :return: str
    '''
    # 2、请求
    driver.get(url)
    # 3、等待:优化为全局变量
    # presence_of_all_elements_located(定位器)  # 等待定位器定位的元素全部出现内容
    # 定位器:是一个元组(使用的定位语法,'对应语法的筛选路径')
    wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="root"]/div/div[2]/div[1]/div[1]/div')))
    # print(res)    # 查看res是webelement对象
    # 4、获取页面源代码
    html_str = driver.page_source
    # print(html_str)
    return html_str


def parse_page(html_str):
    '''
    将页面内容变成element对象使用xpath提取
    :param html_str: 页面的html字符串内容
    :return:
    '''
    tree = etree.HTML(html_str)
    # 提取
    # 获取所有包含书的div
    div_list = tree.xpath('//*[@id="root"]/div/div[2]/div[1]/div[1]/div[position()>1]')
    for div in div_list:
        try:
            # 书名
            book_title = div.xpath('.//div[@class="title"]/a/text()')[0]
            # 详情页url
            book_url = div.xpath('.//div[@class="title"]/a/@href')[0]
            # 评分
            book_score = div.xpath('.//span[@class="rating_nums"]/text()')[0]
            # 评论数
            book_comment_num = div.xpath('.//span[@class="pl"]/text()')[0]
            infos = div.xpath('.//div[@class="meta abstract"]/text()')[0]
            infos = infos.split(r'/')
            # print(infos)
            book_author = infos[0]
            book_price = infos[-1]
            book_public = infos[-3]
            book_date = infos[-2]
            # 创建一个空字典
            item = {}
            item['book_title'] = book_title
            item['book_url'] = book_url
            item['book_score'] = book_score
            item['book_comment_num'] = book_comment_num
            item['book_author'] = book_author
            item['book_price'] = book_price
            item['book_public'] = book_public
            item['book_date'] = book_date
            print(item)
        except Exception:
            pass


def main():
    # 一、确定url
    base_url = 'https://book.douban.com/subject_search?search_text=python&cat=1001&start=%s'
    # 二、分页
    for i in range(10):
        html_str = get_content_by_selenium(base_url % (i*15))
        # 三、解析:将页面内容变成element对象使用xpath提取
        parse_page(html_str)


if __name__ == '__main__':
    # 优化的思想:打开一个浏览器之后,在浏览器中请求即可。
    # 将创建驱动和显示等待对象都应该定义全局变量中即可。
    # 1、创建driver对象
    driver = webdriver.PhantomJS()
    # 创建显式等待
    wait = WebDriverWait(driver, 20)
    main()

相关文章

网友评论

      本文标题:Selenium小知识 - 等待

      本文链接:https://www.haomeiwen.com/subject/dmoiohtx.html