zoukankan      html  css  js  c++  java
  • pythonp爬虫selenium库解析

    Selenium

    selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

    selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

    官方文档:https://selenium-python-zh.readthedocs.io/en/latest/waits.html#id3

    安装及简单使用

    安装:Chrome+selenium

    安装selenium库:

    pip install selenium
    

    安装ChromeDriver

    下载chromdriver.exe放到python安装路径的scripts目录中即可,anaconda同理

    最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads

    注意:

    selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver

    下载链接:https://github.com/mozilla/geckodriver/releases

    简单使用:

    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get("https://www.taobao.com")  # 不可直接www.需在前面加https://
    print(browser.page_source)
    

    声明浏览器对象

    第一步一般都是获取浏览器对象,后续操作都是在该对象下进行

    from selenium import webdriver
    browser=webdriver.Chrome()
    browser=webdriver.Firefox()
    browser=webdriver.PhantomJS()
    browser=webdriver.Safari()
    browser=webdriver.Edge() 
    

    访问页面

    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get("https://www.taobao.com")  # 不可直接www.需在前面加https://
    print(browser.page_source)
    

    选择器

    To find single element

    • find_element_by_id
    • find_element_by_name
    • find_element_by_xpath
    • find_element_by_link_text
    • find_element_by_partial_link_text
    • find_element_by_tag_name
    • find_element_by_class_name
    • find_element_by_css_selector

    To find multiple elements (these methods will return a list):

    • find_elements_by_name
    • find_elements_by_xpath
    • find_elements_by_link_text
    • find_elements_by_partial_link_text
    • find_elements_by_tag_name
    • find_elements_by_class_name
    • find_elements_by_css_selector

    强调:
    1、上述均可以改写成find_element(By.ID,'kw')的形式
    2、find_elements_by_xxx的形式是查找到多个元素,结果为列表

    #官网链接:http://selenium-python.readthedocs.io/locating-elements.html
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    import time
    
    driver=webdriver.Chrome()
    driver.get('https://www.baidu.com')
    wait=WebDriverWait(driver,10)
    
    try:
        #===============示范用法===================
        # 1、find_element_by_id
        print(driver.find_element_by_id('kw'))
    
        # 2、find_element_by_link_text
        # login=driver.find_element_by_link_text('登录')
        # login.click()
    
        # 3、find_element_by_partial_link_text
        login=driver.find_elements_by_partial_link_text('录')[0]
        login.click()
    
        # 4、find_element_by_tag_name
        print(driver.find_element_by_tag_name('a'))
    
        # 5、find_element_by_class_name
        button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))
        button.click()
    
        # 6、find_element_by_name
        input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName')))
        input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password')))
        commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit')))
    
        input_user.send_keys('18611453110')
        input_pwd.send_keys('xxxxxx')
        commit.click()
    
        # 7、find_element_by_css_selector
        driver.find_element_by_css_selector('#kw')
    
        # 8、find_element_by_xpath
    
        time.sleep(5)
    
    finally:
        driver.close()
    

      通过Xpath进行选择:

    #官网链接:http://selenium-python.readthedocs.io/locating-elements.html
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    import time
    
    driver=webdriver.PhantomJS()
    driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
    # wait=WebDriverWait(driver,3)
    driver.implicitly_wait(3) #使用隐式等待
    
    try:
        # find_element_by_xpath
        #//与/
        # driver.find_element_by_xpath('//body/a')  # 开头的//代表从整篇文档中寻找,body之后的/代表body的儿子,这一行找不到就会报错了
    
        driver.find_element_by_xpath('//body//a')  # 开头的//代表从整篇文档中寻找,body之后的//代表body的子子孙孙
        driver.find_element_by_css_selector('body a')
    
        #取第n个
        res1=driver.find_elements_by_xpath('//body//a[1]') #取第一个a标签
        print(res1[0].text)
    
        #按照属性查找,下述三者查找效果一样
        res1=driver.find_element_by_xpath('//a[5]')
        res2=driver.find_element_by_xpath('//a[@href="image5.html"]')
        res3=driver.find_element_by_xpath('//a[contains(@href,"image5")]') #模糊查找
        print('==>', res1.text)
        print('==>',res2.text)
        print('==>',res3.text)
    
    
        #其他
        res1=driver.find_element_by_xpath('/html/body/div/a')
        print(res1.text)
    
        res2=driver.find_element_by_xpath('//a[img/@src="image3_thumb.jpg"]') #找到子标签img的src属性为image3_thumb.jpg的a标签
        print(res2.tag_name,res2.text)
    
        res3 = driver.find_element_by_xpath("//input[@name='continue'][@type='button']") #查看属性name为continue且属性type为button的input标签
        res4 = driver.find_element_by_xpath("//*[@name='continue'][@type='button']") #查看属性name为continue且属性type为button的所有标签
        
        
        time.sleep(5)
    
    finally:
        driver.close()
    

    获取标签属性

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    browser=webdriver.Chrome()
    
    browser.get('https://www.amazon.cn/')
    
    wait=WebDriverWait(browser,10)
    wait.until(EC.presence_of_element_located((By.ID,'cc-lm-tcgShowImgContainer')))
    
    tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img')
    
    #获取标签属性,
    print(tag.get_attribute('src'))
    
    #获取标签ID,位置,名称,大小(了解)
    print(tag.id)
    print(tag.location)
    print(tag.tag_name)
    print(tag.size)
    
    browser.close()
    
    获取标签属性
    

    等待加载

    selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待

    等待分为显式等待和隐式等待:隐式等待针对所有元素有效,等待固定的时间,显式等待只对单个元素,在固定的时间里一直等到该元素出现为止

    隐式:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    browser=webdriver.Chrome()
    
    #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
    browser.implicitly_wait(10)
    
    browser.get('https://www.baidu.com')
    
    
    input_tag=browser.find_element_by_id('kw')
    input_tag.send_keys('美女')
    input_tag.send_keys(Keys.ENTER)
    
    contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
    print(contents)
    
    browser.close()
    
    隐式等待
    

    显式:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    
    
    input_tag=browser.find_element_by_id('kw')
    input_tag.send_keys('美女')
    input_tag.send_keys(Keys.ENTER)
    
    
    #显式等待:显式地等待某个元素被加载
    wait=WebDriverWait(browser,10)
    wait.until(EC.presence_of_element_located((By.ID,'content_left')))  # 传的是元组,一定要注意,拆分传会报参数个数错误
    
    contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
    print(contents)
    
    
    browser.close()
    
    显式等待
    

    预期的条件(EC的属性值)

    自动化的Web浏览器中一些常用的预期条件,下面列出的是每一个实现, Selenium Python binding都提供了一些方便的方法,这样你就不用去编写 expected_condition类或是创建至今的工具包去实现他们。参数一般都是元组

    1. - title_is
    2. - title_contains
    3. - presence_of_element_located
    4. - visibility_of_element_located
    5. - visibility_of
    6. - presence_of_all_elements_located
    7. - text_to_be_present_in_element
    8. - text_to_be_present_in_element_value
    9. - frame_to_be_available_and_switch_to_it
    10. - invisibility_of_element_located
    11. - element_to_be_clickable
    12. - staleness_of
    13. - element_to_be_selected
    14. - element_located_to_be_selected
    15. - element_selection_state_to_be
    16. - element_located_selection_state_to_be
    17. - alert_is_present
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

    expected_conditions 模块提供了一组预定义的条件供WebDriverWait使用。

    selenium操作js等进行互交

    点击与清空

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    browser=webdriver.Chrome()
    browser.get('https://www.amazon.cn/')
    wait=WebDriverWait(browser,10)
    
    
    input_tag=wait.until(EC.presence_of_element_located((By.ID,'twotabsearchtextbox')))
    input_tag.send_keys('iphone 8')
    button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
    button.click()
    
    
    import time
    time.sleep(3)
    
    input_tag=browser.find_element_by_id('twotabsearchtextbox')
    input_tag.clear() #清空输入框
    input_tag.send_keys('iphone7plus')
    button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
    button.click()
    
    
    
    # browser.close()
    
    点击,清空
    

    操作链

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys  # 键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    wait=WebDriverWait(driver,3)
    # driver.implicitly_wait(3)  # 使用隐式等待
    
    try:
        driver.switch_to.frame('iframeResult') ##切换到iframeResult
        sourse=driver.find_element_by_id('draggable')
        target=driver.find_element_by_id('droppable')
    
        #方式一:基于同一个动作链串行执行
        # actions=ActionChains(driver) #拿到动作链对象
        # actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行
        # actions.perform()
    
        #方式二:不同的动作链,每次移动的位移都不同
        ActionChains(driver).click_and_hold(sourse).perform()
        distance=target.location['x']-sourse.location['x']
    
        track=0
        while track < distance:
            ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
            track+=2
    
        ActionChains(driver).release().perform()
    
        time.sleep(10)
    
    finally:
        driver.close()
    

    实现js

    在交互动作比较难实现的时候可以自己写JS(万能方法)

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    
    try:
        browser=webdriver.Chrome()
        browser.get('https://www.baidu.com')
        browser.execute_script('alert("hello world")') #打印警告
    finally:
        browser.close()
    

    frame的切换

    frame相当于一个单独的网页,在父frame里是无法直接查看到子frame的元素的,必须switch_to_frame切到该frame下,才能进一步查找

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
    
    
    try:
        browser=webdriver.Chrome()
        browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    
        browser.switch_to.frame('iframeResult') #切换到id为iframeResult的frame
    
        tag1=browser.find_element_by_id('droppable')
        print(tag1)
    
        # tag2=browser.find_element_by_id('textareaCode') #报错,在子frame里无法查看到父frame的元素
        browser.switch_to.parent_frame() #切回父frame,就可以查找到了
        tag2=browser.find_element_by_id('textareaCode')
        print(tag2)
    
    finally:
        browser.close()
    

    浏览器前进后退

    import time
    from selenium import webdriver
    
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.get('https://www.taobao.com')
    browser.get('http://www.sina.com.cn/')
    
    browser.back()
    time.sleep(10)
    browser.forward()
    browser.close()
    

    cookies

    from selenium import webdriver
    
    browser=webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    print(browser.get_cookies())
    browser.add_cookie({'k1':'xxx','k2':'yyy'})
    print(browser.get_cookies())
    
    # browser.delete_all_cookies()
    

    浏览器选项卡管理

    选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:ctrl+t等,最通用的就是js的方式

    import time
    from selenium import webdriver
    
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('window.open()')
    
    print(browser.window_handles) #获取所有的选项卡
    browser.switch_to_window(browser.window_handles[1])
    browser.get('https://www.taobao.com')
    time.sleep(10)
    browser.switch_to_window(browser.window_handles[0])
    browser.get('https://www.sina.com.cn')
    browser.close()
    

    异常处理

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
    
    try:
        browser=webdriver.Chrome()
        browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
        browser.switch_to.frame('iframssseResult')
    
    except TimeoutException as e:
        print(e)
    except NoSuchFrameException as e:
        print(e)
    finally:
        browser.close()
    

      

  • 相关阅读:
    男子利用POS机帮人非法套现1576万余元被起诉
    套现花样很多 弄不好成了诈骗
    刀尖上的无本生意 信用卡套现投资盛行
    新三板是什么—新三板科普知识讲堂
    Android注入事件的三种方法比较
    当今最流行的Node.js应用开发框架简介
    安卓WindowManager注入事件如何跳出进程间安全限制
    伟大创意检验10要
    初创互联网公司简明创业指南
    根据Unix哲学来编写你的HTML5 Websocket服务器来实现全双工通信
  • 原文地址:https://www.cnblogs.com/wlx97e6/p/9969896.html
Copyright © 2011-2022 走看看