zoukankan      html  css  js  c++  java
  • 爬虫之selenium (二)

    一.简介

    # selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题。
    
    # selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。
    
    from selenium import webdriver
    
    # 谷歌浏览器
    browser=webdriver.Chrome()
    # 火狐浏览器
    browser=webdriver.Firefox()
    # 无界面浏览器
    browser=webdriver.PhantomJS()
    # 苹果浏览器
    browser=webdriver.Safari()
    # IE浏览器
    browser=webdriver.Edge() 

    二.安装(有界面浏览器)

    # 安装:selenium+chromedriver
    pip3 install selenium
    下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.38,并非2.9
    国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/2.38/
    最新的版本去官网找: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简单用法:

    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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    # driver = webdriver.Chrome()
    # driver.get('https://www.baidu.com/')
    # time.sleep(5)
    # driver.close()
    driver = webdriver.Chrome()
    try:
        driver.get('https://www.baidu.com/')
    
        # 获取显性等待
        wait = WebDriverWait(driver, 10)
    
        # 根据ID查找到id为kw的标签
        input_tag = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
    
        # 把输入内容传进input框内
        input_tag.send_keys('围城')
    
        # 方式一(回车):
        # input_tag.send_keys(Keys.ENTER)
    
        # 方式二(点击百度一下):
        button = wait.until(EC.presence_of_element_located((By.ID, 'su')))
        button.click()
        time.sleep(5)
    
    
    finally:
        driver.close()

    四.selenium选择器

    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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    chrome = webdriver.Chrome()
    
    try:
        # 隐性等待: 等待所有标签加载10s
        chrome.implicitly_wait(10)
        chrome.get('https://www.baidu.com/')
    
        # ===============所有方法===================
        # element是查找一个标签
        # elements是查找所有标签
    
        # 1、find_element_by_id 通过id去找
        # input_tag = chrome.find_element_by_id('kw')
        # input_tag.send_keys('墨菲定律')
        # button = chrome.find_element_by_id('su')
        # button.click()
    
        # 2、find_element_by_link_text  通过链接文本去找
        # 登录  精确查找
        # login_button = chrome.find_element_by_link_text('登录 ') 空格找不到的
        # login_button = chrome.find_element_by_link_text('登录')
        # login_button.click()
    
        # 3、find_element_by_partial_link_text  模糊查找
        login_button = chrome.find_element_by_partial_link_text('')
        login_button.click()
    
        # 4、find_element_by_tag_name  通过标签名查找标签
        # a_s = chrome.find_elements_by_tag_name('a')  # 找到第一个a标签
        # print(a_s)
    
        # 5、find_element_by_class_name  通过类名查找标签
        login_button2 = chrome.find_element_by_class_name('tang-pass-footerBarULogin')
        login_button2.click()
    
        # 6、find_element_by_name  # 通过标签查找
        username_input = chrome.find_element_by_name('userName')
        username_input.send_keys('15622792660')
        password_input = chrome.find_element_by_name('password')
        password_input.send_keys('xxxxx')
    
        # 7、find_element_by_css_selector  # 通过属性选择器查找
        login_submit = chrome.find_element_by_css_selector('#TANGRAM__PSP_10__submit')
        login_submit.click()
    
        # 8、find_element_by_xpath
    
    
        time.sleep(5)
    finally:
        chrome.close()

       

    selenium选择器之find_element_by_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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    chrome = webdriver.Chrome()
    
    try:
        # 隐性等待: 等待所有标签加载10s
        chrome.implicitly_wait(10)
        chrome.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
    
        # 1.根据根节点查找  /
        # html = chrome.find_element_by_xpath('/html')
        # print(html)
        # 了解
        # print(html.tag_name)
        # print(html.id)
    
        # head = chrome.find_element_by_xpath('/head')
        # print(head)  # 报错
    
        # 全局查找
        # head = chrome.find_element_by_xpath('//head')
        # print(head)
    
    
        # 查找第一个div标签
        # div = chrome.find_element_by_xpath('//div')
        # print(div.tag_name)
    
        # 查找第一个div标签下的img标签
        # a = chrome.find_element_by_xpath('//a/img')
        # print(a.tag_name)
    
        # 找到所有a标签
        # a_s = chrome.find_elements_by_xpath('//a')
        # print(a_s)  # 获取对象
        # print(a_s[0])  # 获取第一个a标签
        # print(a_s[0].text)  # 获取a标签文本
        # print(a_s[0].get_attribute('href'))  # 获取a标签属性
    
        # 查找第一个div标签下第三个a标签
        # a_3 = chrome.find_element_by_xpath('//div/a[3]')
        # print(a_3.tag_name)
        # print(a_3.text)
    
        # 查找第一个div标签下第三个a标签下的图片
        # a_3 = chrome.find_element_by_xpath('//div/a[3]/img')
        # print(a_3.tag_name)
        # print(a_3.text)
        # print(a_3.get_attribute('src'))
    
        # 获取id为images标签下的第五个a标签下的img
        img_5 = chrome.find_element_by_xpath('//*[@id="images"]/a[5]/img')
    
    
        # 返回属性
        print(img_5)
        print(img_5.text)
        print(img_5.get_attribute('src'))
        print(img_5.location)
        print(img_5.size)
        time.sleep(5)
    finally:
        chrome.close()

    五.selenium交互操作(滑动)

    天猫搜索:
    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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    chrome = webdriver.Chrome()
    chrome.implicitly_wait(10)
    try:
    
        chrome.get('https://www.tmall.com/')
        input_tag = chrome.find_element_by_id('mq')
        input_tag.send_keys('时间革命')
        input_tag.send_keys(Keys.ENTER)
    
        input_tag = chrome.find_element_by_id('mq')
        input_tag.clear()
        input_tag.send_keys('唐诗三百首')
    
        button = chrome.find_element_by_xpath('//*[@class="mallSearch-input clearfix"]/button')
        button.click()
    
        time.sleep(5)
    
    finally:
        chrome.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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    chrome = webdriver.Chrome()
    chrome.implicitly_wait(10)
    
    try:
    
        chrome.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
        # source = chrome.find_element_by_id('draggable')
        # target = chrome.find_element_by_id('droppable')
        # print(source, target)
        # 切换子页面
        # chrome.switch_to_frame('iframeResult')  # 弃用方法
        chrome.switch_to.frame('iframeResult')
        source = chrome.find_element_by_id('draggable')
        target = chrome.find_element_by_id('droppable')
        print(source, target)
    
        # 找父页面(测试,找不到就报错)
        # chrome.switch_to.parent_frame()
        # source = chrome.find_element_by_id('draggable')
        # target = chrome.find_element_by_id('droppable')
        # print(source, target)
    
        # 方式一:
        # 把源图片瞬间拖到目标图片处
        ActionChains(chrome).drag_and_drop(source, target).perform()
    
        # 方式二:
        # 把源图片hold住慢慢移动到目标位置
        ActionChains(chrome).click_and_hold(source).perform()
        # 获取目标图片与源图片的距离
        distance = target.location.get('x') - source.location.get('x')
        s = 0
        while s < distance:
            # 向右移动1步
            ActionChains(chrome).move_by_offset(xoffset=1, yoffset=0).perform()
            s += 1
    
        # 释放鼠标
        ActionChains(chrome).release().perform()
    
        time.sleep(5)
    
    finally:
        chrome.close()
    六.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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    # js操作
    chrome = webdriver.Chrome()
    chrome.implicitly_wait(10)
    try:
    
        chrome.get('https://www.baidu.com/')
        # 向页面发送js代码
        chrome.execute_script("alert('tank is very 马叉虫!')")
        chrome.execute_script("""
        JS代码
        """)
    
        time.sleep(5)
    finally:
        chrome.close()
    
    
    ---------------------------------------------------------------
    # 前进后退
    try:
    
        # 按顺序往目标站点发送请求
        chrome.get('https://www.baidu.com/')
        chrome.get('https://www.tmall.com/')
        chrome.get('https://www.jd.com/')
    
        # 后退
        chrome.back()
    
        # 前进
        chrome.forward()
    
    
        time.sleep(5)
    finally:
        chrome.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  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    def driver_star(driver, key):
    
        try:
            # 所有商品的上一层div
            div_obj = driver.find_element_by_id('J_goodsList')
            # 获取所有商品的商品li
            li_list = div_obj.find_elements_by_class_name('gl-item')
            # print(li_list)
            # 遍历所有商品li
            for li in li_list:
                # 商品链接
                detail_link = li.find_element_by_css_selector('.p-img a').get_attribute('href')
    
                # 商品名称
                g_name = li.find_element_by_css_selector('.p-name em').text
    
                # 商品价格
                g_price = li.find_element_by_css_selector('.p-price i').text
    
                # 评论人数
                g_commit = li.find_element_by_css_selector('.p-commit a').text
    
                goods = '''
    
                ==============tank 商品信息 ================
                    商品链接: %s
                    商品名称: %s
                    商品价格: %s
                    评论人数: %s
                
    
                ''' % (detail_link, g_name, g_price, g_commit)
                print(goods)
    
                # 保存数据
                with open('%s.txt' % key, 'a', encoding='utf-8') as f:
                    f.write(goods)
    
            # 找到文本为“下一页”的标签进行点击
            next_tag = driver.find_element_by_partial_link_text('下一页')
            next_tag.click()
            time.sleep(2)
    
            # 点击下一页后递归执行drver_star
            driver_star(driver, key)
    
            time.sleep(5)
        finally:
            driver.close()
    
    if __name__ == '__main__':
        key = input('请输入爬取的商品内容: ').strip()
        driver = webdriver.Chrome()
        driver.implicitly_wait(10)
        driver.get('https://www.jd.com/')
        # 获取商品输入框
        input_tag = driver.find_element_by_id('key')
        # 把输入的商品传入输入框内
        input_tag.send_keys(key)
        # 控制键盘回车确认查找
        input_tag.send_keys(Keys.ENTER)
        driver_star(driver, key)


  • 相关阅读:
    第4章.计算节点
    Eclipse插件ViPlugin2.X的破解方法
    金刚经
    js
    C++ 重写重载重定义区别
    string::substr()简介
    信息熵与二进制
    一个简单的条件概率问题
    HPLINUX hplinux 安装升级 至 jdk1.8
    linux 解压命令
  • 原文地址:https://www.cnblogs.com/sima-3/p/11077187.html
Copyright © 2011-2022 走看看