Selenium可以模拟网页操作,抓取页面内容,主要通过webdriver模块实现,为了方便理解,按照实例的操作步骤逐一介绍(函数参数不具体展开,参考下面代码实例即可理解):

获取browser实例

通过webdriver.Chorme(), webdriver.Edge(), webdriver.Firefox(), 来获取browser实例:

browser = webdriver.Chrome()

获取之前可以设置参数,比如是否程序结束后自动关闭浏览器,浏览器窗口最大化:

options.add_experimental_option('detach', True) #不自动关闭浏览器

options.add_argument('--start-maximized') #浏览器窗口最大化

获取网页

通过browser实例来获取网页内容:

browser.get('https://www.baidu.com')

获取目标元素

通过webdriver的find_element(by, keyword),find_elements(by, keyword)来获取网页包含的目标元素webelement:

input = browser.find_element(By.ID,'order_id')

操作目标元素

通过webelement的函数和属性对目标元素进行操作,比如在输入框内输入文本:

input.send_keys("目标文本")

webelement对象是selenium中所有元素的父类,也就是webelement对象拥有的方法,其它元素对象都会有,某些方法只是针对特定元素类型有效,而对其它类型无效。以下为一些主要的方法:

(1)、clear:清空文本框中的文本,仅仅对有文本输入特性的元素有效;例如:文本框、多行文本框等;

(2)、click:单击元素,可以通过该方法,让元素获取焦点,点击的是该元素的中心位置;

(3)、find_element系列,有如下查找方式:

By.ID = "id"

By.XPATH = "xpath"

By.LINK_TEXT = "link text"

By.PARTIAL_LINK_TEXT = "partial link text"

By.NAME = "name"

By.TAG_NAME = "tag name"

By.CLASS_NAME = "class name"

By.CSS_SELECTOR = "css selector"

(4)、get_attribute:获取当前元素的特定属性值,如 name、style等;

(5)、id:表示当前元素在selenium中的唯一标识;

(6)、is_displayed:当前元素是否可见;

(7)、is_enabled:当前元素是否可用;

(8)、is_selected:当前元素是否被选中,通常在checkbox、radiobox、select option等元素上;

(9)、location:返回当前元素的左上角坐标X、Y的位置,即在当前页面中的绝对位置坐标;

(10)、location_once_scrolled_into_view:返回当前元素第一次滚动到可视区域时的左上角坐标X、Y的位置,使用此方法可以把不在可视区域的元素滚动到可视区域;

(11)、parent:返回WebDriver对象;

(12)、rect:返回当前元素左上角坐标X、Y值,以及该元素的宽和高,即该元素的显示区域;

(13)、send_keys:向当前元素发送字符串内容,仅仅对可输入web元素有效,如文本框、文本区域等;

a. 常用的非组合键类型:

回车键:Keys.ENTER

删除键:Keys.BACK_SPACE

空格键:Keys.SPACE

制表键:Keys.TAB

回退键:Keys.ESCAPE

刷新键:Keys.F5

b. 常用的组合键类型:

全选:send_keys(Keys.CONTROL,'a')

复制:send_keys(Keys.CONTROL,'c')

粘贴:send_keys(Keys.CONTROL,'v')

剪切:send_keys(Keys.CONTROL,'x')

(14)、size:获取当前元素的宽和高;

(15)、submit:提交当前元素所在的form表单,相当于单击所在form表单内的submit;

(16)、tag_name:获取当前元素的tag name内容,如文本框的值为input;

(17)、text:获取当前元素的inneerText值,即元素开始标签和结束标签之间的文本内容;

(18)、value_of_css_property:获取当前元素的css属性,如获取color的属性值;

等待网页事件

在操作元素之后,等待网页的执行和返回结果,通过WebDriverWait函数实现。

比如让浏览器等待10s,直到id为error_msg的元素显示,并获取error_msg的文本,如果超时则抛出异常:

wait = WebDriverWait(browser,10)

wait.until(EC.visibility_of_element_located((By.ID,'error_msg')))

msg = browser.find_element(By.ID,'error_msg').text

主要的网页事件有以下这些:

presence_of_all_elements_located()类:期望检查是否存在至少一个元素在网页上。返回WebElements列表

visibility_of_any_elements_located()类:期望检查至少有一个元素是可见的在网页上。返回WebElements列表

visibility_of_all_elements_located()类:期望检查所有元素是否存在于a的DOM上页面和可见。用于查找元素一旦找到并可见,就会返回WebElements列表

text_to_be_present_in_element()类:期望检查给定文本是否存在于指定的元素。

text_to_be_present_in_element_value()类:期望检查元素中是否存在给定文本定位器,文本

invisibility_of_element_located()类:用于检查元素是否不可见的期望出现在DOM上。

invisibility_of_element()类:检查元素是否不可见的期望出现在DOM上。

element_to_be_clickable()类:检查元素的期望是可见的并且已启用你可以点击它

staleness_of()类:等到元素不再附加到DOM。element是要等待的元素。如果元素仍附加到DOM,则返回False,否则返回true。

element_to_be_selected()类:选择检查选择的期望。element是WebElement对象

element_located_to_be_selected()类:选择对元素的期望。locator是(by,path)的元组

alert_is_present()类:检查是否出现alter面板

以下为完整python实例代码,实现如下功能:

(1)打开网页

(2)在百度中搜索python

(3)提取第一页所有搜索结果链接,并在浏览器中自动打开前3个

import pyperclip, webbrowser, pprint

from selenium import webdriver

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

options = webdriver.ChromeOptions()

options.add_experimental_option('detach', True) #不自动关闭浏览器

options.add_argument('--start-maximized') #浏览器窗口最大化

browser = webdriver.Chrome(options=options)

try:

browser.get('https://www.baidu.com')

input = browser.find_element(By.ID,'kw')

input.send_keys('Python')

input.send_keys(Keys.ENTER)

wait = WebDriverWait(browser,10)

wait.until(EC.presence_of_element_located((By.ID,'content_left')))

print(browser.current_url)

#print(browser.get_cookies())

pyperclip.copy(browser.page_source)

items = browser.find_elements('tag name', 'h3')

    #方法1:直接用element的click方法,最简单

    for i in items[:3]:

i.find_element('tag name', 'a').click()

    #方法2:获取链接的href再打开,较复杂

    """

links = []

for i in items:

item = {}

item['text'] = i.text

item['href'] = i.find_element('tag name', 'a').get_attribute('href')

links.append(item)

#pprint.pprint(links)

for url in links[:3]:

webbrowser.open(url['href'])

    """

finally:

#browser.close()

print("program end")

相关阅读:

python excel实操之表格转置

python excel实操之99乘法表

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: