zoukankan      html  css  js  c++  java
  • selenium+chromdriver 动态网页的爬虫

    # 获取加载更多的数据有 2 种方法
    # 第一种就是直接找数据接口, 点击'加载更多' 在Network看下, 直接找到数据接口

    # 第二种方法就是使用selenium+chromdriver

    # selenium
    
    from selenium import webdriver
    import time
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    time.sleep(5)
    
    driver.close() # 关闭页面
    driver.quit() # 关闭整个浏览器
    # selenium 定位元素  常用的6种 
    # find_element只获取满足条件的第一个, find_elements获取所有满足条件的
    
    1.find_element_by_id
    2.find_element_by_class_name
    3.find_element_by_name
    4.find_element_by_tag_name
    5.find_element_by_xpath
    6.find_element_by_css_selector
    
    ############################
    from selenium import webdriver
    import time
    from lxml import etree
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 使用 xpath 方式获取 效率高  如果只是解析页面就使用这种
    tree = etree.HTML(driver.page_source)
    li_lists = tree.xpath('xxxxxxxxxx')
    
    
    # 通过id 的方式获取  如果对元素进行操作时, 
    # 比如要发送字符串, 点击按钮, 下拉操作 就使用这种方法
    inputTag = driver.find_element_by_id('kw')
    inputTag.send_keys('python')
    
    
    time.sleep(3)
    driver.close() # 关闭页面
    # driver.quit() # 关闭整个浏览器
    # 常见的表单元素: 
    # input标签  type='text/password/email/number' 属于文本框
    # button、input   type='submit'
    # checkbox  type=‘checkbox’
    # 
    
    ###############
    # 操作表单元素
    # 1.  操作输入框
    inputTag = driver.find_element_by_id('kw')
    inputTag.send_keys('python')
    time.sleep(3)
    
    # 2.  操作checkbox标签  豆瓣为例
    rememberBtn = driver.find_element_by_name('remember')
    rememberBtn.click()
    
    # 3.  操作select标签  要用Select类
    from selenium import webdriver
    from selenium.webdriver.support.ui import Select
    
    selectBtn = Select(driver.find_element_by_name('jumpMenu'))
    selectBtn.select_by_index(1) # 通过index 选中下拉框里的选项
    # selectBtn.select_by_visible_text('95秀客户端')  通过文本内容选中
    
    # 4.  按钮的点击事件
    inputTag = driver.find_element_by_id('kw') #拿到输入框按钮
    inputTag.send_keys('python')
    submitTag = driver.find_element_by_id('su') #拿到点击按钮
    submitTag.click()
    # selenium 的行为链   简单介绍   有时候页面中的操作有很多步,需要一系列操作
    # 在爬虫中用的不多, 在测试用的多
    
    
    from selenium import webdriver
    import time
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 拿到两个标签
    inputTag = driver.find_element_by_id('kw')
    submitBtn = driver.finr_element_by_id('su')
    
    actions = ActionChains(driver)
    actions.move_to_element(inputTag)
    actions.send_keys_to_element(inputTag,'python')
    actions.move_to_element(submitBtn)
    actions.click(submitBtn)
    actions.perform()
    # 在selenium中  cookies操作
    # 1.获取所有的cookie
    for cookie in driver.get_cookies():
        print(cookie)
        
    # 2.根据cookie的key获取value
    value = driver.get_cookie(key)
    
    # 3.删除所有的cookie
    driver.delete_all_cookies()
    
    # 4.删除某一个cookie
    driver.delete_cookie(key)
    
    #################################
    from selenium import webdriver
    import time
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    for cookie in driver.get_cookies():  # 获取的是百度域名下的所有cookie
        print(cookie)
        
    # 页面等待  重要 防止数据没有被加载就开始使用
    # 因为页面很多用ajax技术,有时候要使用的数据没有加载出来,这时候使用就会报错.所以selenium提供两种等待方式
    
    # 隐式等待: 调用driver.implicitly_wait. 那么获取不可用元素之前会先等待10秒时间.
    driver = webdriver.Chrome(executble_path=driver_path)
    driver.implicitly_wait(10)  # 设置等待时间
    driver.get('https://www.baidu.com/')  #请求访问
    
    
    # 显示等待:表明某个条件成立之后才执行获取元素的操作.
    # 也可以在等待的时候制定一个最大的时间,如果超过这个时间那么久跑出异常.
    # 显示等待使用selenium.webdriver.support.excepted_condition期望条件 和 selenium.webdriver.support.ui.webDriverWait配合完成
    from selenium import webdriver
    import time
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 等待10秒后找这个对应的id标签, 因为是错误的所以等待10秒后报错
    # 如果是正确的id 标签, 找到后直接继续执行, 不会等10 秒
    WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID,'shjdkah'))
    )
    # 打开多个窗口, 切换页面  重要 ******
    
    from selenium import webdriver
    import time
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 打开豆瓣
    driver.execute_script('window.open("https://www.douban.com/")')
    # 但是当前的driver还是停留在baidu页面
    print(driver.current_url)
    print(driver.window_handles)  # 窗口句柄 看看现在打开的窗口有什么
    driver.switch_to_window(driver.window_handles[1]) # 切换窗口
    print(driver.current_url)
    
    # 虽然在窗口中切换到了新的页面,但是driver中还没有切换
    # 如果想要在代码中切换到新的页面,并且做爬虫
    # 那么应该使用dirver.switch_to_window来切换到指定的窗口
    # 从dirver.window_handler中取出具体的第几个窗口
    # driver.window_handlers是一个列表,里面装的都是窗口句柄
    # 它会按照打开页面的顺序存储窗口句柄
    # selenium 设置代理ip  主要是添加一个option参数就可以了
    
    from selenium import webdriver
    
    # 设置代理
    options = webdriver.ChromeOptions()
    options.add_argument("--proxy-server-http://112.247.176.104:8060")
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
    driver.get('http://httpbin.org/ip')
  • 相关阅读:
    浅谈MSSQL2012中的列存储索引(columnstore indexes)
    《高性能SQL调优精要与案例解析》新书样章
    关系库执行计划中三种最常用连接方式的伪码实现
    python基础-字符串
    python基础-文件和目录
    python基础-列表
    python基础-对象
    python基础-入门
    python算法-二叉树广度优先遍历
    Python算法-二叉树深度优先遍历
  • 原文地址:https://www.cnblogs.com/kenD/p/11123663.html
Copyright © 2011-2022 走看看