def

小项目一---Python日志分析

∥☆過路亽.° 提交于 2020-12-19 03:40:37
日志分析 概述 分析的前提 半结构化数据 文本分析 提取数据(信息提取) 一、空格分隔 with open( ' xxx.log ' )as f: for line in f: for field in line.split(): print (field) # 注意这里拼接的一些技巧 logs = ''' 138.60.212.153 - - [19/Feb/2013:10:23:29 +0800] "GET /020/media.html?menu\ =3 HTTP/1.1" 200 16691 "-" "Mozilla/5.0 (compatible; EasouSpider; +http://www.easou\ .com/search/spider.html)" ''' fields = [] flag = False tmp = '' #注意拼接 "GET /020/media.html?menu=3 HTTP/1.1"这种字符串需借助标记变量! for field in logs.split(): if not flag and (field.startswith( ' [ ' ) or field.startswith( ' " ' )): if field.endswith( ' ] ' ) or field.endswith( ' " ' ): # 处理首尾均有

python排序 基数排序

此生再无相见时 提交于 2020-12-19 03:02:02
算法思想 基数排序通过按位比较(一般从最低位开始)将元素按照最低位的数放到10个桶中,当所有的元素都这样被处理一次后,在按从0到9的顺序将每个桶的元素再取出来(不关注其他位的,只关注当前位的)这样就完成了所有元素最低位的有序性,然后不断的重复上面的步骤,知道所有元素的最高位都经过处理了。 算法步骤 初始化桶,共有10个,分别存放当前位位0-9的元素 从元素的最后一位开始,按照最后一位的数字将其放到相应的同元素中。对列表中的每个元素都进行上面的操作后,从0号桶开始,将元素从桶中取出来,这样就完成了一个位数的排序 重复上一过程,如果发现元素最高位已经被处理过,就把他添加到最终的结果中 算法实现 算法的主要问题在于对当前位的获取中 对于正数 (element//divisor)%10#结果是当前位上的数#divisor代表当前位,个位是1,十位是10,百位是100#//是向下取整的意思   如过element//divisor结果为0 就代表实际结果小于1了,即当前位已经是0了 对于负数 collection[j]//i==-1#代表是负数   取得当前位 (10-math.ceil(element/divisor)%10)%10#math.ceil()是向上取整 #最后一个%10是防止前面结果=10的情况出现 算法实现 def radix_sort3(collection): '''

python异常 Exception

北慕城南 提交于 2020-12-19 01:12:53
异常 Exception   什么是错误:     错误是指由于逻辑或语法等导致一个程序无法正常执行的问题   什么是异常     异常是程序出错时标识的一种状态   作用:     用于信号,通知上层调用者有错误产生,需要处理 try 语句的两种语法:   try-except 语句   try-finally 语句 try-except语句   语法:      try :       可能触发异常的语句      except 错误类型1 [as 变量1]:       异常处理语句1      except 错误类型2 [as 变量2]:       异常处理语句2      except (错误类型3,错误类型4) [as 变量3]:       异常处理句块3     ...      except :       其它异常处理语句      else :       未发生异常语句      finally :       最终语句     注: [] 代表其中的内容可以省略     作用:       偿式捕获异常,得到异常通知,将程序由异常流程转为正常流程并继续执行 View Code    # 此示例示意异常处理语句try-except 的语法和用法    def div_apple(n):      print ( " %d个苹果你想分给几个人? " % n)

抖音爬虫教程,从0到1,爬取抖音用户详细数据

感情迁移 提交于 2020-12-19 00:59:26
抖音爬虫教程,从0到1,爬取抖音用户详细数据 前言 爬取抖音用户的数据需要使用用户的user_id和sec_user_id,我们通过抓包工具获取用户的id以及sec_user_id,然后通过用户的关注列表和follow列表获取更多的用户的user_id和sec_user_id,下面我将介绍一下如何根据user_id和sec_user_id来获取抖音用户的详细数据。 一、分析请求用户数据的api 1. 用户数据抓包 首先在搭建好的环境中通过Fiddle抓取用户数据包。<br/> <br/> 2. 用户数据包分析 2.1. 请求信息分析 请求头字段 | 字段 | 字段值 | | --- | --- | | 请求方法 | GET | | 请求的api | GET后面的 | | 请求的协议 | api后面的,系http1.1 | | 请求的目的主机域名 | aweme-eagle.snssdk.com | | 连接信息 | keep-alive | | Cookie | 你自己的cookies | | Accept-Encoding 编码信息 | gzip | | X-SS-QUERIES | 请求的query | | token | 你自己的token | | sdk版本 | 1 | | User-Agent | 用户代理 | | X-Khronos | 咱也不知道是啥

Scala学习之路 (五)Scala的关键字Lazy

拥有回忆 提交于 2020-12-18 13:55:44
Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。 在Java中,要实现延迟加载(懒加载),需要自己手动实现。一般的做法是这样的: public class JavaLazyDemo { private String name; // 初始化姓名为huangbo private String initName(){ return "huangbo" ; } public String getName(){ // 如果name为空,进行初始化 if (name == null ){ name = initName(); } return name; } } 在Scala中对延迟加载这一特性提供了语法级别的支持: lazy val name = initName() 使用lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法。也就是说在定义property=initProperty()时并不会调用initProperty()方法,只有在后面的代码中使用变量property时才会调用initProperty()方法。 如果 不使用lazy关键字对变量修饰 ,那么变量property是立即实例化的: object ScalaLazyDemo { def init():String =

Scala学习之路 (十)Scala的Actor

限于喜欢 提交于 2020-12-18 13:55:14
一、Scala中的并发编程 1、Java中的并发编程 ①Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要。 ②Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程去访问这个共享的数据(主要是对这个共享的数据进行修改),同时Java利用加锁的机制(即synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而保证共享数据的一致性。 ③Java中的并发编程存在资源争夺和死锁等多种问题,因此程序越大问题越麻烦。 2、Scala中的并发编程 ①Scala中的并发编程思想与Java中的并发编程思想完全不一样,Scala中的Actor是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况。在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹配并进行相应的处理。 ②如果Actor A和 Actor B要相互沟通的话,首先A要给B传递一个消息,B会有一个收件箱,然后B会不断的循环自己的收件箱, 若看见A发过来的消息,B就会解析A的消息并执行,处理完之后就有可能将处理的结果通过邮件的方式发送给A。 二、Scala中的Actor 1、什么是Actor 一个actor是一个容器,它包含 状态, 行为,信箱,子Actor 和

电话号码的字母组合

↘锁芯ラ 提交于 2020-12-18 11:49:19
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入: "23" 输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 思路是回溯+递归,利用一个栈来存储字母。 具体实现就是,先用迭代存储一个字母,如果栈没满就递归并迭代存储字母,直到栈满再把栈里的内容扔到返回数组里,或者某个字母已经递归完了所有后续,就回到了上一层递归函数,把这个用过的字母pop出去,继续迭代 递归。 这里有个巨几把恶心的坑,就是我为少写几个参数在combine里用了static修饰的top和size,如果只测试一次,确实是没问题的,但是多测试几次就傻逼了啊!!!一开始我用了strcpy,给我报了个执行错误,特么地根本没头绪好吗,后来我自己写了个赋值,报了个空指针错误,妈的空你妹啊!!!还好聪明机智的我,最后还是发现了问题所在,花了快1小时的时间找一个“不存在的错误”。。。MMP。。。 唉,回想起来,以前总看见提示说什么什么,可能是你使用C/C++的全局变量,特么地我现在是真的印象深刻了!!! /* * * Return an array of size *returnSize. * Note: The returned array must be

scala成长之路(5)问题记录

こ雲淡風輕ζ 提交于 2020-12-18 11:37:59
还是在看scala sdk源码的时候,有很多问题要考自己慢慢摸索,这里做个记录。 一. 隐式转换的作用域? 隐式转换需要三个因素 1. 己方(当前对象) 2. 转换函数 3. 对方(转换的目标类) 这三个需要在同一个作用域内才能生效吗?举个简单的例子,依然是java HashSet隐式转换为scala Set(可以参看本系列(3)),我们只是在要用到转换的文件里写了一行: import scala.collection.JavaConverters._ 也就是说导入了JavaConverters单例中的全部转换函数,但是我们并没有导入转换的目标类AsScala,所以按道理来说当前解释器并不知道AsScala的存在,就更不知道asScala方法要去哪寻找了。所以我们换一种思路,解释器的执行顺序也许是样: 1. 发现某个对象上调用了不存在的方法f 2. 以该对象为输入参数 寻找所有的隐式转换函数 3. 列出所有隐式转换函数的 输出参数类 4. 看看这些类中 是否有方法f ;如有,则执行转换;没有则报错。 因此我们可以回答所提出的问题了:并不需要三者在同一作用域内才能生效,只需要原对象、转换函数,就能触发隐式转换。 二. 隐式转换遇到继承类怎么办? 例如 class SmartAnimal (n:String){ val name = n } class Person (n:String

爬虫爬取抖音热门音乐

老子叫甜甜 提交于 2020-12-18 07:42:25
爬取抖音的热门音乐 这个就相对来说简单一点,这是代码运行的结果 获取音乐的网址https://kuaiyinshi.com/hot/music/?source=dou-yin&page=1 打开该网页F12,F5刷新 做义工只需要以上的数据 根据beautifulsoup去获取,直接上代码 headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } # 保存路径 save_path = "G: \\ Music \\ douyin \\ " url = "https://kuaiyinshi.com/hot/music/?source=dou-yin&page=1" # 获取响应 res = requests.get(url , headers =headers) # 使用 beautifulsoup 解析 soup = BeautifulSoup(res.text , 'lxml' ) # 选择标签获取最大页数 max_page = soup.select( 'li.page-item > a' )[- 2 ].text # 循环请求 for page

Python中的序列化和反序列化

喜你入骨 提交于 2020-12-18 06:55:28
为什么要序列化 内存中的字典、列表、集合以及各种对象,如何保存到一个文件中。 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列。所以必须把数据额转换为字节序列,输出到文件,这就是序列化,反之,从文件的字节 序列恢复到内存中,就是反序列化。 1、定义 Serialization系列化,将内存中对象存储下来,把他变成一个个字节。二进制。 deSerialization反序列化,将文件的一个个字节到内存中。 序列胡保存到文件就是持久化。 可将数据序列化后持久化,或者网络传输,也可以将文件中或者网络接受到的字节序列反序列化。 2、pickle库 Python中的序列化、反序列化模块 dumps对象序列化为bytes对象 dump对象序列化到文件对象,就是存入到文件。 loads从bytes对象反序列化。 load对象反序列化,从文件读取数据. ## import pickle filename = 'ser' x= 'a' y = '100' z = '100' with open(filename,'wb') as f: pickle.dump(x,f) pickle.dump(y,f) pickle.dump(z,f) with open(filename,'rb')as f: for _ in range(3): a = pickle.load(f)