zoukankan      html  css  js  c++  java
  • 爬虫Selenium

    一.安装

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

    官网:http://selenium-python.readthedocs.io

    二、安装浏览器驱动

    a..谷歌

    1.点击下载chrome的webdriver:http://chromedriver.storage.googleapis.com/index.html

    注意:对于chrome浏览器,有时候会有闪退的情况,有时候也许是版本冲突的问题

    2.将下载文件,放入python文件 下的 Scripts文件,解压

     

    或者在cmd,输入

    这样,OK!

    b.Firefo浏览器

     可下载地址:https://github.com/mozilla/geckodriver/releases/

    三.开始

    初步体验:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('http://www.jiemian.com/')  #在Chome,打开此网址

    开始使用:

    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  # 与EC联用,等待某个元素被加载
    import time
    
    browser = webdriver.Chrome()
    try:
        wait = WebDriverWait(browser, 10)
    
        browser.get('https://www.taobao.com/')
    
        # By.CSS_SELECTOR
        # By.CLASS_NAME
        # By.XPATH
        # By.ID
        # By.TAG_NAME
    
        # inp_tag1=browser.find_element(By.CSS_SELECTOR,'#kw') #browser.find_element_by_id('kw')
        inp_tag1=browser.find_element(By.ID,'q') #browser.find_element_by_class('kw')
        inp_tag1.send_keys('iphoneX')
    
        button=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'btn-search')))
        # button.click()
        button.send_keys(Keys.ENTER)
    
        wait.until(EC.presence_of_element_located((By.CLASS_NAME,'inner')))
    
        page_next=browser.find_element(By.CSS_SELECTOR,'.next a')
        print(page_next)
        page_next.click()
    
        #拿到标签的属性
        attr=page_next.get_attribute('data-value')
        print(attr)
    
        #拿到标签的内容
        span = browser.find_element(By.CSS_SELECTOR, '.next span')
        print(span.text)
    
        time.sleep(100)
    
    finally:
        browser.close()
    输入框自动添加搜索内容1
    from selenium import webdriver  #驱动浏览器
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By  #选择器
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait  #与EC连用,等待某个元素被加载
    
    import time
    
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser,10)
    
    browser.get('https://www.baidu.com')
    input_tag = browser.find_element_by_id('kw')
    
    input_tag.send_keys('啤酒')  #输入搜索词
    
    button = browser.find_element_by_id('su')  #点击搜索
    button.click()
    
    wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等标签content_left,加载完,
    
    res = browser.page_source
    
    with open('a.html','w',encoding='utf-8') as f:
        f.write(res)
    
    
    time.sleep(20)
    browser.close() #关闭
    输入框自动添加搜索内容2

    四.三种选择器

    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')
    
    #以下三种方式达到的都是同一种效果:查找id为kw的标签
    input_tag1=browser.find_element(By.ID,'kw') #等同于:input_tag1=browser.find_element_by_id('kw')
    
    input_tag2=browser.find_element(By.CSS_SELECTOR,'#kw') #等同于:input_tag2=browser.find_element_by_css_selector('#kw')
    
    input_tag3=browser.find_element(By.XPATH,'//*[@id="kw"]') #等同于:input_tag3=browser.find_element_by_xpath('//*[@id="kw"]')
    
    #注意:browser.find_elements系列与browser.find_element的区别就是,前者是查找多个,后者是只找第一个
    div1=browser.find_element(By.CSS_SELECTOR,'div') #找到第一个div标签
    div2=browser.find_elements(By.CSS_SELECTOR,'div') #找到所有的div标签,放到列表里
    
    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.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()
    获取标签属性

    五.等待元素被加载

    #1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待
    
    #2、等待的方式分两种:
    隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
    显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
    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()
    显示等待

    六.元素交互操作

    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')
        browser.execute_script('alert("hello world")')  #打印警告
    
    finally:
        time.sleep(10)
        browser.close()
    在交互动作比较难实现的时候可以自己写JS(万能方法)
  • 相关阅读:
    hash和history的区别帮助向我一样迷的人弄明白,history和hash
    调用谷歌浏览器的打印所遇到的困难,回流重绘
    webpack简单搭建基础感悟
    linux
    介绍一下call,apply,bind方法实现,源于MDN中的bind
    二进制流转base64加快速度
    手写一个instanceof
    青蛙跳台阶问题
    Django中vue的使用
    pip install 出现 timeout 时的两个临时解决办法
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7586535.html
Copyright © 2011-2022 走看看