zoukankan      html  css  js  c++  java
  • 爬虫之标签查找补充及selenium模块的安装及使用与案例

    今日内容概要

    • bs模块之标签查找
    • 过滤器
    • selenium模块

    今日内容详细

    html_doc = """
    <html>
        <head>
            <title>The Dormouse's story</title>
        </head>
    <body>
        <p id="my p" class="title">
            <b id="bbb" class="boldest">The Dormouse's story</b>
        </p>
    
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    
    <p class="story">...</p>
    """
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html_doc,'lxml')
    #2、获取标签的名称
    # print(soup.p.name)
    #3、获取标签的属性
    # print(soup.p.attrs)
    #4、获取标签的内容
    # print(soup.p.text)
    #5、嵌套选择
    # print(soup.head.title.string) # 依次往内部查找
    # print(soup.body.a.string)
    #6、子节点、子孙节点
    # print(soup.p.contents) #p下所有子节点
    # print(soup.p.children) #得到一个迭代器,包含p下所有的子节点
    # for child in soup.p.children:
    #    print(child)
    #7、父节点、祖先节点
    # print(soup.a.parent) #获取a标签的父节点
    # print(soup.a.parents) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲……
    # for p in soup.a.parents
    #    print(p)
    #8、兄弟节点
    # print('=====>')
    # print(soup.a.next_siblings) #下一个兄弟
    # for i in soup.a.next_siblings:
    #    print(i)
    # print(soup.a.previons_sibling) #上一个兄弟
    # print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
    # print(soup.a.previous_siblings) #上面的兄弟们=>生成器对象
    """
    儿子:在一个标签内部的第一层级标签
         <span>相对于下面同级别的div就是哥哥</span>
         <div>
             <div>相对于外层的div就是儿子
                 <p>上一层div的儿子上上一层div的孙子</p>
             </div>
             <p>相对于外层的div就是儿子</p>
         </div>
         <span>相对上面同级别的div就是弟弟</span>
    后代
    兄弟
    弟弟
    哥哥
    """
    

    过滤器

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(html_doc,'lxml')
    #1、五种过滤器:字符串、正则表达式、列表、True、方法
    #1.1、字符串:即标签名  结果是一个列表 里面的元素才是真正的标签对象
    # print(soup.find_all('b')) # [<b> class="boldest" id="bbb">The Dormouse's story</b']
    
    #1.2、正则表达式
    # import re  # 一定要注意拿到的结果到底是什么数据类型
    # print(soup.find_all(re.compile('^b'))) # 找出b开头的标签,结果有body和b标签
    
    #1.3、列表:如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回。下面代码找到文档中所有<a>标签和<b>标签:
    # print(soup.find_all(['a','b'])) # 找到文档中所有<a>标签和<b>标签
    
    #1.4、True:可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
    # print(soup.find_all(True)) # True表示所有
    # for tag in soup.find_all(True):
    #     print(tag.name)
    
    #1.5、方法:如狗哦没有合适的过滤器,那么还可以定义一个方法,方法只接受一个元素参数,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是返回 False
    # def has_class_but_no_id(tag):
    #     return tag.has_attr('class') and not tag.has_attr('id')
    #
    # print(soup.find_all(has_class_but_no_id))
    

    中文文档

    https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-parents-find-parent
    

    selenium模块

    嫩够帮你自动操作浏览器
    selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
    
    selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
    
    1.需要下载模块
        pip3 install -i
    2.还需要下载一个控制浏览器的驱动
    http://npm.taobao.org/mirrors/chromedriver/2.38/
        # 注意下载的驱动一定呀跟你浏览器的版本匹配  不能无法操作
        如何查看当前浏览器版本
    3.下载好的驱动文件有两个存放的位置
       1.直接放在你项目的目录下
       2.放到Python安装路径的scripts目录中即可
    from selenium import webdriver
    import time
    bro=webdriver.Chrome()  # 生成谷歌浏览器的驱动对象
    bro.get("http://www.baidu.com")  # 自动打开谷歌浏览器访问百度首页
    bro.implicitly_wait(10)  # 设置一个等待时间 超出范围还没加载出来就放弃
    # 1、find_element_by_id   根据id找
    # 2、find_element_by_link_text     根据链接名字找到控件(a标签的文字)
    # 3、find_element_by_partial_link_text   根据链接名字找到控件(a标签的文字)模糊查询
    # 4、find_element_by_tag_name       根据标签名
    # 5、find_element_by_class_name     根据类名
    # 6、find_element_by_name           根据属性名
    # 7、find_element_by_css_selector   根据css选择器
    aEle = bro.find_element_by_link_text('登录')
    # 点击a标签
    aEle.click()
    # 通过id获取p标签
    pEle = bro.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn')
    # 点击p标签
    pEle.click()
    # 通过id找获取用户用户名的input框
    UserEle = bro.find_element_by_id('TANGRAM__PSP_11__userName')
    # 点击UserEle
    UserEle.click()
    # 输入用户名
    UserEle.send_keys('18856211855')
    time.sleep(1)
    # 通过id找获取用户密码的input框
    PwdEle = bro.find_element_by_id('TANGRAM__PSP_11__password')
    # 点击UserEle
    PwdEle.click()
    # 输入用户名
    PwdEle.send_keys('xxxxxx')
    time.sleep(1)
    SubEle = bro.find_element_by_id('TANGRAM__PSP_11__submit')
    SubEle.click()
    print(bro.get_cookies())  # 直接组织成字典里面有所有的键值对    
    print(bro.get_cookie())  # Get a single cookie by name
    
    bro.close()
    

    等待元素加载完毕

    """
    有些页面的标签元素并不是直接写在html文件上的而是通过后续
    js代码动态加载出来的 所以需要在查找标签的时候设置一个等待时间
    """
    # 隐式等待:在查找所有元素时,如果尚未被加载,则等10秒(推荐使用)
    # browser.implicitly_wait(10)   表示等待所有,
    
    # 显式等待:显式地等待某个元素被加载(不推荐使用)
    # wait=WebDriverWait(browser,10)
    # wait.until(EC.presence_of_element_located((By.ID,'content_left')))
    

    为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
  • 相关阅读:
    getElement方法封装
    使用Ajax (put delete ) django原生CBV 出现csrf token解决办法
    (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
    协程介绍, Greenlet模块,Gevent模块,Genvent之同步与异步
    Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures
    线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)
    进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
    在Python程序中的进程操作,multiprocess.Process模块
    进程前戏 (操作系统简述 什么是进程)
    django ModelForm
  • 原文地址:https://www.cnblogs.com/abudrSatan1998/p/13693717.html
Copyright © 2011-2022 走看看