python爬虫----selenium

selenium相当于机器人,可以完成点击等人类可以做的操作.
webdriver是一系列可以驱动不同浏览器的软件,和selenium配合使用.
软件准备:安装了selenium这个第三方库和不同浏览器的driver

 

安装测试:

from selenium import webdriver
#webdriver是用来区分不同的浏览器的

#这个是浏览器驱动程序的路径
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"

#webdriver后面那个类,可以选Edge,Chrome,还是火狐更好用一点
driver=webdriver.Firefox(executable_path=driver_path)
driver.get(r"https://www.baidu.com/s?wd=chrome%20driver&rsv_spt=1&rsv_iqid=0x8bfc640c0009118d&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=12&rsv_sug1=11&rsv_sug7=100")
    #不同于urllib,requests库,它的get()不会返回响应对象,而是放到属性中.
print(driver.page_source)

关闭页面:

'''有两个方法:
driver.close():关闭当前页面
driver,quit():关闭整个浏览器'''

from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/baidu?wd=%E5%93%88%E5%93%88%E5%93%88%E8%A1%A8%E6%83%85%E5%8C%85&tn=monline_4_dg&ie=utf-8"
driver.get(url)


time.sleep(4)
driver.close()
driver.quit()

元素定位:

'''

    find_element_by_id:根据id来查找某个元素。等价于:
        submitTag = driver.find_element_by_id('su')
        submitTag1 = driver.find_element(By.ID,'su')

    find_element_by_class_name:根据类名查找元素。 等价于:
        submitTag = driver.find_element_by_class_name('su')
        submitTag1 = driver.find_element(By.CLASS_NAME,'su')

    find_element_by_name:根据name属性的值来查找元素。等价于:
        submitTag = driver.find_element_by_name('email')
        submitTag1 = driver.find_element(By.NAME,'email')

    find_element_by_tag_name:根据标签名来查找元素。等价于:
        submitTag = driver.find_element_by_tag_name('div')
        submitTag1 = driver.find_element(By.TAG_NAME,'div')

    find_element_by_xpath:根据xpath语法来获取元素。等价于:
        submitTag = driver.find_element_by_xpath('//div')
        submitTag1 = driver.find_element(By.XPATH,'//div')

    find_element_by_css_selector:根据css选择器选择元素。等价于:
        submitTag = driver.find_element_by_css_selector('//div')
        submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')

    要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。
    所有方法都有两个版本.
'''
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)

inputTag=driver.find_element_by_id("kw")
inputTag.send_keys("python")#整个方法是用来操作输入框的

操作表单元素:

'''

    text/password/number
    操作输入框:分为两步:
        第一步:找到这个元素。
        第二步:使用send_keys(value),将数据填充进去。示例代码如下:
            inputTag = driver.find_element_by_id('kw')
            inputTag.send_keys('python')
        使用clear方法可以清除输入框中的内容。示例代码如下:
            inputTag.clear()

    checkbox底层也是input实现的
    操作checkbox:
        因为要选中checkbox标签,在网页中是通过鼠标点击的,
        因此想要选中checkbox标签,那么先选中这个标签,然后执行click事件。示例代码如下:
            rememberTag = driver.find_element_by_name("rememberMe")
            rememberTag.click()

    选择select:
        select元素不能直接点击,
        因为点击后还需要选中元素,
        这时候selenium就专门为select标签提供了一个类selenium.webdriver.support.ui.Select,
        将获取到的元素当成参数传到这个类中,创建这个对象,
        以后就可以使用这个对象进行选择了,
        示例代码如下:

         from selenium.webdriver.support.ui import Select
         # 选中这个标签,然后使用Select创建对象
         selectTag = Select(driver.find_element_by_name("jumpMenu"))
         # 根据索引选择
         selectTag.select_by_index(1)
         # 根据值选择
         selectTag.select_by_value("http://www.95yueba.com")
         # 根据可视的文本选择
         selectTag.select_by_visible_text("95秀客户端")
         # 取消选中所有选项
         selectTag.deselect_all()

    操作按钮:操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了。示例代码如下:
        inputTag = driver.find_element_by_id('su')
         inputTag.click()


'''

#操作输入框:
from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://bbs.byr.cn/"
driver.get(url)
time.sleep(2)

#输入框
    #先获取用户名
input_id=driver.find_element_by_id("id")
input_id.send_keys("woshiid")
time.sleep(2)
    #在获取密码框:
input_passwd=driver.find_element_by_id("pwd")
input_passwd.send_keys("woshimima")
time.sleep(2)

#然后操作selectbox
from selenium.webdriver.support.ui import Select
savetime_select=Select(driver.find_element_by_name("CookieDate"))
savetime_select.select_by_value("3")
time.sleep(2)

#最后操作按钮
submit=driver.find_element_by_id("b_login")
submit.click()
time.sleep(2)

行为链:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)


inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')

actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()

'''click_and_hold(element):点击但不松开鼠标。
context_click(element):右键点击。
double_click(element):双击。 更多方法请参考'''

操作Cookie:

'''Cookie操作:

    获取所有的cookie:
            for cookie in driver.get_cookies():
                print(cookie)

    根据cookie的key获取value:
            value = driver.get_cookie(key)

    删除所有的cookie:
            driver.delete_all_cookies()

    删除某个cookie:
            driver.delete_cookie(key)

'''

等待:

'''
现在的网页越来越多采用了 Ajax 技术,
这样程序便不能确定何时某个元素完全加载出来了。
如果实际页面等待时间过长导致某个dom元素还没出来,
但是你的代码直接使用了这个WebElement,
那么就会抛出NullPointer的异常。为了解决这个问题。
所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
'''

'''
就好比浏览器是老师,
dom元素就是学生,
老师找学生有事,有两个办法,
隐式等待:可以等学生都到齐以后再找学生,
显示等待:也可以等某个特定的学生,那个学生一来老师就不等了'''

'''所以,隐式等待是针对页面的,
显示等待是针对某个元素的'''


from selenium import webdriver
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
#隐式等待,等待页面加载
driver.implicitly_wait(20)
driver.get(url)

'''
显示等待是表明某个条件成立,才执行获取元素的操作、
也可以等待的时候指定一个最大的时间,
如果超过这个时间那么就会抛出一个异常(exceptions.TimeoutException)。
显示等待是应该使用 selenium.webdriver.support.excepted_conditions期望的条件和
selenium.webdriver.support.ui.webDriverWait 来配合完成。'''
from selenium.webdriver.support.ui import WebDriverWait  # 显示等待
# 设置等待执行语句
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
try:
    element = WebDriverWait(driver, 10).until(
        # 位于...位置存在某个元素
        # EC.presence_of_element_located((By.ID, 'form_email'))  # 必须是元组
        EC.text_to_be_present_in_element(
            (By.XPATH, '//div[@class="main"]/div[@class="mod"]/h2[1]'),
            '热点内容  • • • • • •  ( 更多 )')
    )
    # element.send_keys('python')
    print(element)
finally:
    driver.quit()

多页面与页面切换:

from selenium import webdriver
import time
driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"
driver=webdriver.Firefox(executable_path=driver_path)
url=r"https://www.baidu.com/"
driver.get(url)

#但这个时候如果我要切换到另一个页面去,但又不想丢失原有的页面
    #用此方法执行一段JavaScript代码就好
driver.execute_script("window.open('https://www.cnblogs.com/jingdenghuakai/p/11695431.htmlhtttps://www.douban.com')")

#该属性为当前执行页面的url
driver.current_url

'''执行driver.execute_script("window.open('htttp://www.douban.com')")语句
后,只是打开了一个页面,当前执行的页面并没有变化.
所以要切换执行页面.
补充一点,driver对象有个属性为window_handler,
是个列表,按照窗口创建的顺序储存着窗口handler对象,
切换页面的时候,只要把目标窗口的handler对象传进去就好'''
driver.switch_to.window(driver.window_handles[1])
print(driver.current_url)
print(driver.window_handles)

代理ip:

from selenium import webdriver
import time

#关键步骤在此
options = webdriver.FirefoxOptions()
options.add_argument("--proxy-server=http://171.13.103.221:9999")

driver_path=r"D:\Assist\browserDriver\Mozila-driver\geckodriver.exe"

#这里也要修改
driver=webdriver.Firefox(executable_path=driver_path,options=options)
url=r"https://www.baidu.com/"
driver.get(url)

WebElement元素拓展:

'''
WebElement拓展:
from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
有一些常用的属性:
    find_element():
    get_attribute(name):这个标签的某个属性的值。
    screentshot("filename"):获取当前页面的截图。这个方法只能在driver上使用。
    driver的对象类,也是继承自WebElement。
    更多请阅读相关源代码。

'''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值