一、整理selenium使用步骤
- 创建驱动对象
- 请求
- 等待
- 获取页面内容
初识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()
网友评论