Python网页抓取- python selenium使用方法和代码示例

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

  1. 获取browser实例

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

browser = webdriver.Chrome()

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

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

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

  1. 获取网页

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

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

  1. 获取目标元素

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

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

  1. 操作目标元素

通过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的属性值;

  1. 等待网页事件

在操作元素之后,等待网页的执行和返回结果,通过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乘法表

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿越光年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值