美文网首页
三:总结

三:总结

作者: YANG_c08b | 来源:发表于2018-12-19 08:42 被阅读0次

    1.多线程
    线程:python的thread模块是比较底层的模块,python的threading模块是对thread做了一些
    包装的,可以更加方便的被使用

    python的threading.Thread类有一个run方法,用于定义线程的功能函数,
    可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,
    通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,
    当该线程获得执行的机会时,就会调用run方法执行线程。

    2.互斥锁
    当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制

    线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。

    互斥锁为资源引入一个状态:锁定/非锁定

    某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;
    直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。
    互斥锁保证了每次只有一个线程进行写入操作,
    从而保证了多线程情况下数据的正确性。

    3.死锁问题
    在线程间共享多个资源的时候,
    如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

    4.多线程爬虫
    Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;

    队列是线程间最常用的交换数据的形式

    包中的常用方法:

    Queue.qsize() 返回队列的大小

    Queue.empty() 如果队列为空,返回True,反之False

    Queue.full() 如果队列满了,返回True,反之False

    Queue.full 与 maxsize 大小对应

    Queue.get([block[, timeout]])获取队列,timeout等待时间

    创建一个“队列”对象
    import Queue

    myqueue = Queue.Queue(maxsize = 10)
    将一个值放入队列中

    myqueue.put(10)
    将一个值从队列中取出
    myqueue.get()

    5.多进程
    进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。

    不仅可以通过线程完成多任务,进程也是可以的

    工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,
    因此导致了有了不同的状态

    进程的创建:
    multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,
    可以执行另外的事情

    6.携程
    协程,又称微线程,纤程。英文名Coroutine。
    协程是python个中另外一种实现多任务的方式,
    只不过比线程更小占用更小执行单元(理解为需要的资源)。
    为啥说它是一个执行单元,因为它自带CPU寄存器上下文。这样只要在合适的时机,
    我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复
    CPU上下文那么程序还是可以运行的。

    协程和线程差异:
    在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。
    操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,
    操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。
    但是协程的切换只是单纯的操作CPU的上下文,
    所以一秒钟切换个上百万次系统都抗的住。

    7.Selenium
    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,
    类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,
    不同是Selenium 可以直接运行在浏览器上,
    它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。
    Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,
    甚至页面截屏,或者判断网站上某些动作是否发生。
    页面的相关操作:

    获取name标签值
    element = driver.find_element_by_name("user-name")

    获取标签名值
    element = driver.find_elements_by_tag_name("input")

    也可以通过XPath来匹配
    element = driver.find_element_by_xpath("//input[@id='passwd-id']")

    关于元素的选取,有如下的API 单个元素选取
    find_element_by_id
    find_elements_by_name
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector

    selenium执行JavaScript语句:
    driver = webdriver.PhantomJS(路径)
    driver.get("https://www.baidu.com/")

    #### 给搜索输入框标红的javascript脚本
    js = "var q=document.getElementById(\"kw\");q.style.border=\"2px solid red\";"
    
    #### 调用给搜索输入框标红js脚本
    driver.execute_script(js)
    
    #### 查看页面快照
    driver.save_screenshot("redbaidu.png")
    
    #### js隐藏元素,将获取的图片元素隐藏
    img = driver.find_element_by_xpath("//*[@id='lg']/img")
    driver.execute_script('$(arguments[0]).fadeOut()',img)
    
    #### 向下滚动到页面底部
    driver.execute_script("window.scrollTop(0,document.body.scrollHeight)")
    
    #### 弹出弹窗
    driver.execute_script('alert("This is a alert")')
    
    #### 查看页面快照
    driver.save_screenshot("nullbaidu.png")
    
    driver.quit()
    

    模拟滚动条滚动到底部

    from selenium import webdriver
    import time
    
    driver = webdriver.PhantomJS()
    driver.get(
        "https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90&action="
    )
    
    #### 向下滚动10000像素
    js = "document.body.scrollTop=10000"
    #js="var q=document.documentElement.scrollTop=10000"
    time.sleep(3)
    
    ##### 查看页面快照
    driver.save_screenshot("douban.png")
    
    #####执行JS语句
    driver.execute_script(js)
    time.sleep(10)
    
    ##### 查看页面快照
    driver.save_screenshot("newdouban.png")
    
    #### 退出浏览器
    driver.quit()
    

    8.mongo数据库的操作
    查看当前数据库名称
    db

    列出所有在物理上存在的数据库
    show dbs

    切换数据库 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
    use 数据库名称

    查看当前数据库信息
    db.stats()

    数据库删除:db.dropDatabase()

    db:当前数据库的名字。
    collections:当前数据库的集合数。
    objects:当前数据库所有集合总所包含的对象(即文档)的数量。
    avgObjSize:每个文档的平均大小(以字节为单位)。
    dataSize:此数据库中保存的未压缩数据的总大小,不是指占有磁盘大小,单位是bytes。
    storageSize:分配给此数据库的集合用于存储文档的空间总量,也就是当前数据库占有磁盘大小,单位是bytes。
    numExtents:当前数据库所有集合包含的扩展数量的统计。
    indexes:数据库中包含的所有集合的索引总数,也就是system.indexes表数据行数。
    indexSize:此数据库上创建的所有索引的总大小,单位是bytes
    

    创建集合:
    db.createCollection(name, options)

    查看当前数据库所有集合
    show collections:当前数据库的集合数。

    删除集合:
    db.集合名称.drop() 如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false

    9.mongo与python交互以及增删该查

    pip3 install pymongo

    import pymongo
    from bson.objectid import ObjectId

    创建一个mongodb的客户端呢连接

    mongo_client = pymongo.MongoClient(
    host='127.0.0.1',
    port=27017
    )

    切换到指定的数据库

    db = mongo_client.mongo1805

    db = mongo_client['mongo1805']

    使用集合(存在直接使用,不存在直接创建)

    col_name = db.students

    col_name = db['students']

    def insert_data():
    document = {
    'name':'dufuhao',
    'num':'110',
    'gender':'1'
    }
    document1 = {
    'name': 'dufuhao2',
    'num': '1100',
    'gender': '0'
    }
    document2 = {
    'name': 'dufuhao3',
    'num': '1100',
    'gender': '0'
    }

    result = col_name.insert(document)
    print(result)
    result = col_name.insert([document2,document1])
    # col_name.insert_one()
    # col_name.insert_many()
    print(result)
    

    def remove_data():

    #multi=True,表示删除多条
    result = col_name.remove({'name':'dufuhao'})
    #删除一条
    result = col_name.remove({'name': 'dufuhao'},multi=False)
    
    #删除一条
    col_name.delete_one()
    #删除多条
    col_name.delete_many()
    

    def update_data():
    #指定属性更新
    result = col_name.update({'name':'dufuhao3'},{'$set':{'gender':'1'}})
    print(result)
    #全文的那个更新
    result = col_name.update({'name': 'dufuhao3'}, {'gender': '1'})
    print(result)

    #根据_id跟新属性
    result = col_name.update(
        {'_id':ObjectId("5c00937011575e4353efa716")},
        {'$set':{'num':'1200'}}
    )
    print(result)
    

    def find_data():
    result = col_name.find({})
    print(result)
    result = col_name.find({'gender':'1'})
    print([ i for i in result])

    if name == 'main':

    # insert_data()
    # remove_data()
    # update_data()
    find_data()
    

    10.scrapy框架
    Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰, 榄块之
    间的榈合程度低,可扩展性极强,可以灵活完成各种需求 。 我们只需要定制开发几个模块就可以轻松
    实现一个爬虫

    Scrapy框架的架构组成:
    Engine 。 引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心 。
    Item 。 项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该 Item 对象 。
    Scheduler 。 调度器,接受引擎发过来的请求并将其加 入 队列中 , 在引擎再次请求的时候将
    请求提供给引擎 。
    Down loader。 下载器,下载网页内容,并将网页 内 容返回给蜘蛛 。
    Spiders 。 蜘蛛,其内定义了爬取的逻辑和网页 的解析规则 ,它主要负责解析响应并生成提取
    结果和新的请求 。
    Item Pipel i ne 。 项目管道,负责处理由蜘蛛从网页中 抽 取的项目,它的主要任务是清洗、验
    证和存储数据 。
    Downloader Middlewares 。 下载器中间件,位于引擎和下载器之间 的钩子框架,主要处理引
    擎与下载器之间的请求及响应 。
    Spide Middlewares 蜘蛛中间件,位于引擎和蜘蛛之 间 的钩子框架,主要处理蜘蛛输入的
    响应和输出的结果及新的请求

    创建项目命令:scrapy startproject 项目名字
    创建爬虫文件:scrapy genspider 爬虫文件 域名

    相关文章

      网友评论

          本文标题:三:总结

          本文链接:https://www.haomeiwen.com/subject/jordkqtx.html