zoukankan      html  css  js  c++  java
  • python之路_爬虫之selenium模块

      selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。如下:

    from selenium import webdriver
    browser=webdriver.Chrome()     #弹出浏览器-谷歌浏览器
    browser=webdriver.Firefox()
    browser=webdriver.PhantomJS()  #无界面浏览器
    browser=webdriver.Safari()
    browser=webdriver.Edge() 

    一、使用安装

      selenium+chromedriver安装:

    #1、安装selenium:
    pip3 install selenium
    #2、下载chromdriver.exe
      下载chromdriver.exe放到python安装路径的scripts目录中即可
    镜像链接:http://npm.taobao.org/mirrors/chromedriver/2.29/
    官网链接:https://sites.google.com/a/chromium.org/chromedriver/downloads
    
    #验证安装
    C:UsersAdministrator>python3
    Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from selenium import webdriver
    >>> driver=webdriver.Chrome()  #弹出浏览器
    >>> driver.get('https://www.baidu.com')
    >>> driver.page_source
    
    #注意:
    selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver
    下载链接:https://github.com/mozilla/geckodriver/releases

      selenium+phantomjs安装:

    #1、下载selenium
    pip3 install selenium
    #2、下载phantomjs
      下载phantomjs,解压后把phantomjs.exe所在的bin目录放到环境变量
    镜像链接:http://npm.taobao.org/dist/phantomjs/
    下载链接:http://phantomjs.org/download.html
    
    #验证安装
    C:UsersAdministrator>phantomjs
    phantomjs> console.log('egon gaga')
    egon gaga
    undefined
    phantomjs> ^C
    C:UsersAdministrator>python3
    Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from selenium import webdriver
    >>> driver=webdriver.PhantomJS()    #无界面浏览器
    >>> driver.get('https://www.baidu.com')
    >>> driver.page_source

    二、基本应用实例

    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
    
    browser=webdriver.Chrome()
    try:
        browser.get('https://www.baidu.com')
        input_tag=browser.find_element_by_id('kw')
        input_tag.send_keys('美女')       #python2中输入中文错误,字符串前加个u
        input_tag.send_keys(Keys.ENTER)  #输入回车
    
        wait=WebDriverWait(browser,10)
        wait.until(EC.presence_of_element_located((By.ID,'content_left')))    #等到id为content_left的元素加载完毕,最多等10秒
    
        print(browser.page_source)       #获取页面内容
        print(browser.current_url)       #获取当前请求url
        print(browser.get_cookies())     #[{},{},{}...]
        time.sleep(10)
    
    finally:
        browser.close()                  #一定要关闭浏览器,否则会在后台

     三、选择器介绍

    1、基本选择器

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    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 
    import time
    
    '''
    1、find_element_by_id
    2、find_element_by_link_text
    3、find_element_by_partial_link_text
    4、find_element_by_tag_name
    5、find_element_by_class_name
    6、find_element_by_name
    
    7、find_element_by_css_selector
    8、find_element_by_xpath
    '''
    
    
    driver=webdriver.Chrome()
    wait=WebDriverWait(driver,3)  #显式等待
    try:
        driver.get("https://www.baidu.com/")
        # 1、find_element_by_id:根据id获取input输入框
        input_tag=driver.find_element_by_id("kw")
        print(input_tag.tag_name)
        print(input_tag.get_attribute('name'))
        print(input_tag.text)
    
        #2、find_element_by_link_text :根据可以点击的文本找标签
        login_btn=driver.find_element_by_link_text("登录")
        login_btn.click()
    
        # 3、find_element_by_partial_link_text:根据可以点击的部分文本找标签
        login_btn = driver.find_element_by_partial_link_text("")
        login_btn.click()
    
        # 4、find_element_by_class_name
        user_login=driver.find_element_by_class_name("tang-pass-footerBarULogin")
        # 因为此标签的点击功能是通过绑定事件实现的,所以需通过如下两种等待事件加载完后才可以执行点击代码
        # 方式一:
        user_login=wait.until(EC.presence_of_element_located((By.CLASS_NAME,"tang-pass-footerBarULogin")))  #元组
      
    #方式二: user_login=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,"tang-pass-footerBarULogin"))) #元组 user_login.click() #5、find_element_by_name user_input=driver.find_element_by_name("userName") pswd_input=driver.find_element_by_name("password") ensure_btn=driver.find_element_by_id("TANGRAM__PSP_10__submit") user_input.send_keys("骑猪走秀") pswd_input.send_keys("xxxxxxxxxxx") ensure_btn.click() time.sleep(10) finally: driver.close()

    2、xpath选择器

    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.implicitly_wait(3)  #隐式等待
    try:
        driver.get("https://doc.scrapy.org/en/latest/_static/selectors-sample1.html")
        # 1、//与/
        tag=driver.find_element_by_xpath("/html/body/div/a")  #代表从html中找儿子body,从body中找儿子div,从div中找儿子a
        print(tag.text)
        print(tag.get_attribute("href"))
        print(tag.tag_name)
    
    
        tag=driver.find_elements_by_xpath("//a")         #从全篇找所有的a,结果为列表
        print(tag)  #[]
    
        tag = driver.find_element_by_xpath("//a")        # 从全篇找第一个出现的a
        print(tag.text)
    
        tag=driver.find_elements_by_xpath("//div//a")    #从全篇找所有的div下的所有子子孙孙a
        #选择器查找
        tag=driver.find_elements_by_css_selector("div a")
        print(len(tag))
    
    
        # 2查找第几个
        tag=driver.find_elements_by_xpath("//div//a[5]")  #查找第5个a
        print(tag[0].text)                                #[] 即使只有一个对象也是以列表的形式显示,因为elements
        
        tag = driver.find_element_by_xpath("//div//a[5]")  # 查找第5个a,与上述效果一样
        print(tag.text)
    
        #3按照属性查找:以下三者效果一样
        tag1 = driver.find_element_by_xpath('//a[@href="image4.html"]')
        tag2 = driver.find_element_by_xpath('//a[4]')
        tag3 = driver.find_element_by_xpath('//a[contains(@href,"image4")]')  #模糊查找
    
        print(tag1.text)
        print(tag2.text)
        print(tag3.text)
    
    
        # 4、其他
        driver.find_elements_by_xpath('//*[@class="xxxxx"]')                    #具有class="xxxxx"属性的任何标签
        driver.find_elements_by_xpath('//div[@class="xxxxx"][@class="yyyyy"]')  #同时具有class="xxxxx"和class="yyyyy"属性的div标签
    
        print(driver.find_element_by_xpath('//a[img/@src="image2_thumb.jpg"]').text)  #找到子标签img的src属性为image2_thumb.jpg的a标签
        print(driver.find_element_by_xpath('//a//..').tag_name)                       #获得a标签的父标签
    
        print([tag.tag_name for tag in driver.find_elements_by_xpath('//img//..')])   #..获得所有的img标签的父标签
    
        img = driver.find_element_by_xpath('//img')
        print(img.location)                                      #位置坐标:{'x': 8, 'y': 30}
        print(img.size)                                          #长宽大小:{'height': 16, 'width': 16}
        time.sleep(5)
    
    finally:
        driver.close()

    3、获取标签属性

      通过如上选择器拿到标签对象tag,可以通过如下形式获得标签的相关属性值,如下:

    print(tag.get_attribute('src'))                #获取标签属性
    print(tag.id)                                  #获取标签ID
    print(tag.location)                            #获取标签位置
    print(tag.tag_name)                            #获取标签名称
    print(tag.size)                                #获取标签大小

    4、等待元素加载

      selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待在选择器的基本介绍中,我们分别用到了两种等待元素加载的方式,分别为隐式等待和显示等待。分别总结如下:

    (1)隐式等待:在browser.get('xxx')前就设置,针对所有元素有效

    browser=webdriver.Chrome()
    browser.implicitly_wait(10)                                        #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
    browser.get('https://www.baidu.com')

    (2)显式等待:在browser.get('xxx')之后设置,只针对某个元素有效

    from selenium.webdriver.support.wait import WebDriverWait 
    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    wait=WebDriverWait(browser,10)                                     #显式等待:显式地等待某个元素被加载
    wait.until(EC.presence_of_element_located((By.ID,'content_left')))

    四、元素交互操作

    1、输入、点击、清空

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    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 
    import time
    driver=webdriver.Chrome()
    driver.implicitly_wait(3)
    try:
        driver.get("https://www.jd.com/")
        input_tag=driver.find_element_by_id('key')
        input_tag.send_keys('情趣用品')                 #输入内容
        input_tag.send_keys(Keys.ENTER)                #Keys.ENTER代表回车键
    
        time.sleep(3)
        input_tag = driver.find_element_by_id('key')
        input_tag.clear()                              #清空内容
        input_tag.send_keys('苍进空')
        input_tag.send_keys(Keys.ENTER)
        time.sleep(5)
    finally:
        driver.close()

    2、ActionChains操作

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    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
    import time
    try:
        driver=webdriver.Chrome()
        driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
        driver.implicitly_wait(3)
    
        driver.switch_to.frame('iframeResult')              #若页面套子页面,直接查找子页面元素不成功,需要切换到子页面内
        # driver.switch_to.parent_frame()                   #切回到父页面
    
    
    
        # 方式一:基于一条链,从头一下移动到尾部
        source = driver.find_element_by_id('draggable')
        target = driver.find_element_by_id('droppable')
        actions=ActionChains(driver)
        actions.drag_and_drop(source,target).perform()      #记得每一步操作完需要.perform()
    
    
        # 方式二:基于不同ActionChains,可以控制移动的位移
        source = driver.find_element_by_id('draggable')
        target = driver.find_element_by_id('droppable')
    
        distance=target.location['x'] - source.location['x']
    
        ActionChains(driver).click_and_hold(source).perform()                         #点击拖住
        # ActionChains(driver).move_by_offset(xoffset=distance,yoffset=0).perform()
        # ActionChains(driver).release().perform()
    
        res=0
        while res < distance:
            ActionChains(driver).move_by_offset(xoffset=1,yoffset=0).perform()        #多次移动
            res+=1
        ActionChains(driver).release().perform()                                      #移动到位后释放鼠标
        time.sleep(5)
    finally:
        driver.close()

    五、应用实例

      爬取jd商品信息

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    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 
    import time
    
    
    def get_gods(driver):
        try:
            goods=driver.find_elements_by_class_name("gl-item")
            for good in goods:
                detail_url = good.find_element_by_tag_name('a').get_attribute('href')
                god_name=good.find_element_by_css_selector(".p-name em").text.replace("
    ","")
                god_price=good.find_element_by_css_selector(".p-price i").text
                comment_num=good.find_element_by_css_selector(".p-commit a").text
    
                msg = '
    商品 : %s
    链接 : %s
    价钱 :%s
    评论 :%s
    '% (god_name, detail_url, god_price, comment_num)
                with open("gods.text",'a',encoding="utf-8") as f:
                    f.write(msg)
    
                print(msg, end='
    
    ')
            page_num = driver.find_element_by_css_selector("#J_bottomPage .curr").text
            print(page_num)
    
    
            next_page=driver.find_element_by_partial_link_text('下一页')
            next_page.click()
            time.sleep(10)
            get_gods(driver)
        except Exception:
            print("出错啦")
    
    def main(keyword):
        driver=webdriver.Chrome()
        driver.implicitly_wait(3)
        try:
            driver.get("https://www.jd.com/")
            input_tag=driver.find_element_by_id("key")
            input_tag.send_keys(keyword)
            input_tag.send_keys(Keys.ENTER)
            get_gods(driver)
        finally:
            driver.close()
    if __name__ == '__main__':
        main("振动棒")

       163邮箱自动发送邮件:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    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
    import time
    
    browser=webdriver.Chrome()
    browser.implicitly_wait(5)
    try:
        browser.get('http://mail.163.com/')
    
        frame=browser.find_element_by_id('x-URS-iframe')
        browser.switch_to.frame(frame)
        browser.find_element_by_css_selector('.m-container')
    
        inp_user=browser.find_element_by_name('email')
        inp_pwd=browser.find_element_by_name('password')
        button=browser.find_element_by_id('dologin')
        inp_user.send_keys('用户名')
        time.sleep(2)
        inp_pwd.send_keys('密码')
        time.sleep(2)
        button.click()
    
        #如果遇到验证码,可以把下面一小段打开注释
        # import time
        # time.sleep(10)
        # button = browser.find_element_by_id('dologin')
        # button.click()
        browser.find_element_by_id('dvNavTop')
        write_msg=browser.find_elements_by_css_selector('#dvNavTop li')[1]   #获取写信按钮
        write_msg.click()
    
        browser.find_element_by_class_name('tH0')
        recv_man=browser.find_element_by_class_name('nui-editableAddr-ipt')
        title=browser.find_element_by_css_selector('.dG0 .nui-ipt-input')
        recv_man.send_keys('收件地址')
        title.send_keys('爬虫练习')
        print(title.tag_name)
    
    
        frame=browser.find_element_by_class_name('APP-editor-iframe')
        browser.switch_to.frame(frame)
        body=browser.find_element(By.CSS_SELECTOR,'body')
        body.send_keys('我是机器,testing中。。。请勿回复')
    
        browser.switch_to.parent_frame()                                    #切回他爹
        send_button=browser.find_element_by_class_name('nui-toolbar-item')
        send_button.click()
    
        time.sleep(10)
    
    except Exception as e:
        print(e)
    finally:
        browser.close()
     
    
    
    
     
     user_login.click()
  • 相关阅读:
    Http 请求处理流程
    ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效
    Android Animation学习笔记【转载】
    Http Handler 介绍
    对路径XXX的访问被拒绝(文件操作权限)的解决方法
    控制页面滚动条
    Sqlserver查询字段默认值
    Ajax基础
    浮动&定位
    定时器
  • 原文地址:https://www.cnblogs.com/seven-007/p/8260870.html
Copyright © 2011-2022 走看看