• 爬虫必备之selenium


    selenium是一个自动化测试的工具,我不是搞那方面的,所以也在那方面的具体应用不太了解。但是,这并不影响我在爬虫和其它方面的使用。

    安装: 使用pip安装就可以了。
    注:使用selenium之前需要下载chromedriver.exe放入chorme安装的文件夹,并配置环境变量哦!具体自行百度解决。

    具体使用:
    一、.声明浏览器对象:browser = webdriver.Chrome()
    二、.访问页面: browser.get('https://www.baidu.com') #访问url,也就是相当于在地址栏上访问url
    其它操作:

    print(browser.page_source)  #查看网页源码
    print(browser.get_cookies()) #查看cookies
    print(browser.current_url)  #查看url

    三、查找元素:.

    1.查找单个元素:

    常用

    input_1 = browser.find_element_by_id('q')  #查找id为q的那个标签包含的东西
    input_2 = browser.find_element_by_css_selector('#q')  #  '#'选择id,‘.’选择class
    input_3 = browser.find_element_by_xpath('//*[@id="q"]')  #使用xpath语法选择
    print(input_1,input_2,input_3)

    其它常用查找语法:

    ## browser.find_element_by_id
    ## browser.find_element_by_xpath
    ## browser.find_element_by_link_text   通过链接文字定位
    ## browser.find_element_by_partial_link_text  通过链接文字的部分文字定位
    ## browser.find_element_by_tag_name
    ## browser.find_element_by_class_name
    ## browser.find_element_by_css_selector
    
    # 通用方法:  browser.find_element(a,b)   参数a填入查找方式(如By.ID),参数b填入查找的目标
    # 例如:browser.find_element(By.ID,'q')

    查找单个元素的通用方法查找:
    一个例子:

    browser.get('https://www.taobao.com')
    input_first = browser.find_element(By.ID,'q')
    #其它的按需要更改第一个参数与第二个参数、其它参数

    2.查找多个元素

    查找多个元素 在通用查找方法的基础上element加个s,代表复数即多个查找
    常用:

    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')  #返回id为service-bd的标签下的所有li标签。
    print(lis)

    其它常用查找语法:

    # 查找多个元素:
    ## browser.find_elements(By.CSS_SELECTOR,'')
    ## browser.find_elements(By.ID,'')
    ## browser.find_elements(By.LINK_TEXT,'')  通过链接文字定位
    ## browser.find_elements(By.PARTIAL_LINK_TEXT,'')  通过链接文字的部分文字定位
    ## browser.find_elements(By.TAG_NAME)
    ## browser.find_elements(By.XPATH)
    ## browser.find_elements(By.CLASS_NAME)
    
    # browser.find_elements(a,b)   参数a填入查找方式(如By.ID),参数b填入查找的目标
    # 例如:browser.find_elements(By.ID,'q li')  查找id为q的标签内的所有li标签,并返回

    四、元素交互动作:

    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    
    input1 = browser.find_element(By.ID,'q')  #**id为q所在的标签对应是一个搜**索框
    input1.send_keys('oppo')   #将搜索框的搜索内容的值置为 'oppo',也就是在搜索框输入 oppo.
    time.sleep(5)
    
    input1.clear()  #清除搜索框
    
    button = browser.find_element(By.CLASS_NAME,'btn-search') #查找'搜索'按钮,并创建搜索按钮对象
    button.click() #点击搜索

    五、执行JavaScript

    from selenium import webdriver
    import time
    #实现下拉屏幕
    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.comexplore')
    
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')  #滑动到最底部
    browser.execute_script('alert("complte")')  #在实现下拉功能之后,弹窗提示。

    六、获取元素信息

    1.获取属性值

    logo = browser.find_element(By.ID,'zh-top-link-logo') #查找id为zh-top-link-logo的标签
    logo_class = logo.get_attribute('class') 
    #获取id为zh-top-link-logo的标签的class属性,并赋值给变量logo_class

    2.获取文本值

    # zu-top-add-question 为class属性的值,这里用来定位使用,定位到class属性的值为 zu-top-add-question的标签。
    logo = browser.find_element(By.CLASS_NAME,'zu-top-add-question')
    print(logo.text)
    # 3.获取ID、位置、标签名、大小
    print(logo.id)
    print(logo.location)
    print(logo.tag_name)
    print(logo.size)

    七、等待:
    1.隐式等待
    当使用了隐式等待 执行测试的时候,如果webdriver没有在DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。
    也就是当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间是0.
    我觉得用来判断监测页面是否能否及时刷新和出来。

    browser.implicitly_wait(10) #默认是0
    browser.get('https://www.zhihu.comexplore')
    input = browser.find_element(By.CLASS_NAME,'zu-top-add-question')

    2.显示等待
    人工给定一个最长等待时间,在该最长等待时间内,如果判断是True,则返回值,
    如果一直是Flase,则会一直等待,若是超出最长等待时间,则返回异常。

    from selenium import webdriver
    from  selenium.webdriver.common.by import By
    from  selenium.webdriver.support import expected_conditions as EC
    from  selenium.webdriver.support.wait import WebDriverWait
    
    
    browser = webdriver.Chrome()
    browser.get('http://www.taobao.com/')
    wait = WebDriverWait(browser,300)  #传入最长等待时间
    
    input = wait.until(EC.presence_of_element_located((By.ID,'q')))
    #定义等待条件,直到....返回True时...返回值
    print(input)

    八、 cookies
    大家心里都有数的,直接上代码:

    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.comexplore')
    print(browser.get_cookies()) #获取cookies
    
    
    browser.add_cookie({'name':'chenruhai','domain':'www.zhihu.com','value':'germey'})
    print(browser.get_cookies())  #添加cookie之后再次查看
    
    browser.delete_all_cookies() #删除所有cookie记录
    print(browser.get_cookies()) 

    其实还可以切换浏览器的标签页:

    from selenium import webdriver
    import time
    
    
    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(2)
    
    browser.switch_to_window(browser.window_handles[0]) #切换回第一个选项卡,然后get新的url,也就是在第一个选项卡访问别的url
    browser.get('https://www.python.org/')
    
    browser.execute_script('window.open()')  #在第二个基础上,打开(增加)下一个选项卡
    browser.switch_to_window(browser.window_handles[2])
  • 相关阅读:
    PyMySQL TypeError: not enough arguments for format string
    使用python3抓取pinpoint应用信息入库
    JS 异步之 async await
    JS Null 空 判断
    Vue问题汇总
    pymysql DAO简单封装
    py可视化执行过程
    jenkins回滚之groovy动态获取版本号
    容器时间 容器乱码问题
    SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]
  • 原文地址:https://www.cnblogs.com/chenruhai/p/12464229.html
Copyright © 2020-2023  润新知