Selenium 爬虫爬取并修改网页内容

import time
from selenium import webdriver
browser=webdriver.Chrome() #需要下载Chromedriver
driver =webdriver.Edge()#需要下载Edgedriver
#实例化1个谷歌浏览器对象
browser.get('https://www.baidu.com/')  
#实例化1个Edge浏览器对象driver.get(URL)
time.sleep(5)
browser.close()

示例:

#encoding=utf-8
import os,sys
login_url="http://192.168.0.1/"
from selenium.webdriver.common.keys import Keys
import time
import selenium
from selenium import webdriver
#辅助元素定位
from selenium.webdriver.common.by import By
import traceback

try:
        
    exepath=os.path.dirname(sys.executable)
    driverpath= os.path.dirname(sys.executable)+(r'\\MicrosoftWebDriver.exe')
    driver =webdriver.Edge(executable_path=driverpath)
    from selenium.webdriver.support.ui import Select

    URL="http://192.168.0.1/"

    driver.get(URL)
    print(driver)
    time.sleep(3)
    e1=driver.find_element(By.ID,'Password')
    e1.send_keys('1qaz2wsx')
    time.sleep(1)
    e1=driver.find_element(By.ID,'logIn')
    e1.click()
    driver.implicitly_wait(20)
    time.sleep(2)
    driver.implicitly_wait(5)
    # driver.switch_to.frame("wifi_form")
    # time.sleep(2)
    html_str = driver.page_source
    # print(html_str)
    # os.chdir(r'C:\\')
    # with open('baidu.html', 'wb') as f:
    #     f.write(html_str)
    print('找到m_Settings,setting 按钮')
    Settingsid = driver.find_element(By.ID, 'm_Settings')
    time.sleep(1)
    print(r'鼠标悬停在setting')
    # ActionChains(driver).move_to_element(Settingsid).perform()  # 鼠标悬停
    # Settingsid.move_to_element(Settingsid)
    time.sleep(1)
    # 有一组下拉框wireless在第上3个
    # 标签是li
    # move_to_element(to_element)
    print(r'找到wifi,并点击')
    Wirelessoption = driver.find_element_by_xpath(r'//*[@id="m_Settings"]/ul/li[3]/a')
    time.sleep(1)
    driver.execute_script("arguments[0].click();", Wirelessoption)
    time.sleep(2)
    #已经进入WIFI界面

    print(r'点击Advanced Settings,进入下调出下拉框/')
    AdvanceSettings = driver.find_element_by_xpath(r'//*[@id="RADIO_2GHz"]/div[1]')
    time.sleep(2)
    driver.execute_script("arguments[0].click();", AdvanceSettings)
    time.sleep(1)
    # print(r'点击802。11 mode list3')
    print(r'点击802.11mode')
    for i in range(1,4):
        print(i)
        full_xpath=r'/html/body/form/div/div[3]/div[3]//td/div/div/ul/li[%s]/a'%i
        wifimode = driver.find_element_by_xpath(full_xpath)
        time.sleep(0.5)
        driver.execute_script("arguments[0].click();",wifimode)
        time.sleep(0.5)
        time.sleep(5)
    time.sleep(3)
    for i in range(1,14):
        full_xpath=r'/html/body/form/div/div[3]/div[3]/tbody/tr[3]/td/div/div/ul/li[%s]/a'%i
        channel1 = driver.find_element_by_xpath(
            # '/html/body/form/div/div[3]/div[3]//td/div/div/ul/li[2]/a')
            full_xpath)
        time.sleep(0.5)
        driver.execute_script("arguments[0].click();",channel1)
        time.sleep(0.5)
        time.sleep(5)
    # channel1.send_keys(Keys.RETURN)

    print(r'找到保存按钮')
    Savebutton = driver.find_element_by_xpath(r'//*[@id="Save_btn"]')
    # time.sleep(1)
    driver.execute_script("arguments[0].click();", Savebutton)
    time.sleep(1)
    # Savebutton.click()
    time.sleep(30)#
    time.sleep(2)
    print('前进')
    driver.forward()
    time.sleep(1)
    SaveOK=driver.find_element_by_id('Confirm_btn')
    print(SaveOK.text)
    driver.execute_script("arguments[0].click();", SaveOK)
    time.sleep(1)
    print('press OK ')
    print('点击OK按钮')
except Exception as e:
    os.chdir(exepath)
    traceback.print_exc(file=open(r'error.txt', 'a+'))
=================================================================================

要想定位页面的元素,selenium提供了一系列的方法。

1) 通过标签id属性进行定位driver .find_element_by_id('xx') # 其中xx便是页面中某个元素的id值

2) 通过标签name属性进行定位

# 两种方式是一样的
driver .find_element_by_name("xx") # 其中xx是页面中某个元素的name值
3) 通过标签名进行定位

driver .find_element_by_tag_name("xxx") # xx参数表示的就是图片标签img
4) 通过CSS查找方式进行定位

driver .find_elements_by_css_selector("#xxx") #xx 根据选择器进行定位查找,其中#xx表示的是id选择器名称是kw的
5) 通过xpath方式定位

driver .find_element_by_xpath('//*[@id="kw"]') # 参数即是xpath的语法
6) 通过搜索页面中链接进行定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

driver .find_element_by_link_text("xxx")
通过搜索页面中链接进行定位 ,可以支持模糊匹配**

driver .find_element_by_partial_link_text("xx") # 查找页面所有的含有百度的文字链接
2. selenium显示等待和隐式等待
显示等待:就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception

操作格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait()一般由until()或 until_not()方法配合使用 until(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为True until_not(method, message=' '):调用该方法提供的驱动程序作为一个参数,直到返回值为False
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
隐式等待:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。

注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
driver.implicitly_wait() 默认设置为0
例如:driver.implicitly_wait(10) 。如果元素在10s内定位到了,继续执行。如果定位不到,将以循环方式判断元素是否被定位到。如果在10s内没有定位到,则抛出异常

from selenium import webdriver
 
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 隐式等待10秒
driver.implicitly_wait(10)
另外还有一种就是我们常用的sleep,我们称为:强制等待。有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。

from time import sleep
from selenium import webdriver
 
driver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 强制休眠2秒
sleep(2)
driver.find_element_by_id("xx").send_keys("1234567890")
 
3. 元素交互操作
用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽(滑动验证)等等。而selenium给我们提供了一个类来处理这类事件——ActionChains;

selenium.webdriver.common.action_chains.ActionChains(driver)
这个类基本能够满足我们所有对鼠标操作的需求。

1) actionChains的基本使用:

首先需要了解ActionChains的执行原理,当你调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的时间会依次执行。

这种情况下我们可以有两种调用方法:

链式写法

menu = driver.find_element_by_css_selector(".div1")
hidden_submenu =    driver.find_element_by_css_selector(".div1 #menu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
分步写法

menu = driver.find_element_by_css_selector(".div1")
hidden_submenu = driver.find_element_by_css_selector(".div1 #menu1")
 
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()
两种写法本质是一样的,ActionChains都会按照顺序执行所有的操作。

2) actionChains方法列表:

click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值