一些核心模块的介绍

sys模块 模块方法 解释说明 sys.argv 传递到Python脚本的命令行参数列表,第一个元素是程序本身路径 sys.executable 返回Python解释器在当前系统中的绝对路径 sys.exit(arg) 程序中间的退出,arg=0为正常退出 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称,Linux是linux2,Windows是win32 sys.stdout.write(str) 输出的时候把换行符\n去掉 val = sys.stdin.readline()[:-1] 拿到的值去掉\n换行符 sys.version 获取Python解释程序的版本信息 os模块 方法 说明 os.mkdir() 创建目录 os.rmdir() 删除目录 os.rename() 重命名 os.remove() 删除文件 os.getcwd() 获取当前工作路径 os.walk() 遍历目录 os.path.join() 连接目录与文件名 os.path.split() 分割文件名与目录 os.path.abspath() 获取绝对路径 os.path.dirname() 获取路径 os.path.basename() 获取文件名或文件夹名 os.path.splitext() 分离文件名与扩展名 os.path.isfile() 判断给出的路径是否是一个文件 os.path.isdir() 判断给出的路径是否是一个目录 json模块 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。 ...

8 min · 3974 words · Luenci

京东全网爬虫

完整代码见: https://github.com/Lucareful/JingDongSpider 写在前面: 折腾了很久的用python做爬虫项目到现在也该告一段落了,看视频学,遇到bug自己查找,代码思路不对重新写,环境不对自己配置….一路上跌跌撞撞,过程很艰苦,所幸结果为好。 ...

4 min · 1890 words · Luenci

基于Python语言的IP代理池

环境:python3.6 MongoDB flask requests等第三方库 完整代码见: https://github.com/Lucareful/IPProxyPool 代理池概述 什么是代理池 代理池就是有代理IP组成的池子,它可以提供多个稳定可用的代理IP 为什么要实现代理池 我们在做爬虫的时候,最常见的一种反爬虫手段就是:IP反爬;也就是当同一个IP访问这个网站的次数过多,频率过高,就会限制这个IP的访问。就是需要经常换IP; 使用IP代理池是其中一个比较常用的方案 免费代理都是非常不稳定的,有10%是可用就很不错了 一些收费代理稳定性也不好 目的:从一堆不稳定的代理IP中,抽取高可用代理IP,给爬虫使用 代理池开发环境 python3开发语言 requests:发送请求,获取页面数据 lxml:使用XPATH从页面提取我们想要的书籍 pymonge:把提取到代理IP存储到MongoDB数据库中和MongoDB数据库中读取代理IP,给爬虫使用 Flask:用于提供WEB服务 代理池工作流程 1.代理池工作渡程描述: 代理IP采集模块->采集代理IP->检测代理IP->如果不可用用,直接过滤掉,如果可用,指定默认分数->存入数据库中 代理IP检测模块->从数据库中获取所有代理IP->检测代理IP->如果代理IP不可用用,就把分数-1,如果分数为0从数据库中删除,否则更新数据库,如果代理IP可用,恢复为默认分值,更新数据库 代理API模块->从数据库中高可用的代理IP给爬虫使用; ...

13 min · 6061 words · Luenci

大数据之Hadoop

Hadoop介绍 组成部分 Hadoop主要由3部分组成: Mapreduce编程模型 HDFS分布式文件存储 YARN ...

6 min · 2851 words · Luenci

妹子图爬虫(爬取妹子图图片)

python实现妹子图爬虫(爬取妹子网图片) 一个简单的小爬虫实现爬取妹子图网站上的图片。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 #coding=utf-8 import requests from bs4 import BeautifulSoup import os all_url = 'http://www.mzitu.com' #http请求头 Hostreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://www.mzitu.com' } Picreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://i.meizitu.net' } #此请求头破解盗链 start_html = requests.get(all_url,headers = Hostreferer) #保存地址 path = "D:\\mzitu\\" #找寻最大页数 soup = BeautifulSoup(start_html.text,"html.parser") page = soup.find_all('a',class_='page-numbers') max_page = page[-2].text same_url = 'http://www.mzitu.com/all/' for n in range(1,int(max_page)+1): ul = same_url+str(n) start_html = requests.get(ul, headers = Hostreferer) soup = BeautifulSoup(start_html.text,"html.parser") all_a = soup.find('div',class_='all').find_all('a',target='_blank') for a in all_a: title = a.get_text() #提取文本 if(title != ''): print("准备扒取:"+title) #win不能创建带?的目录 if(os.path.exists(path+title.strip().replace('?',''))): #print('目录已存在') flag=1 else: os.makedirs(path+title.strip().replace('?','').replace(':', '')) flag=0 os.chdir(path + title.strip().replace('?','').replace(':', '')) href = a['href'] html = requests.get(href,headers = Hostreferer) mess = BeautifulSoup(html.text,"html.parser") pic_max = mess.find_all('span') try: pic_max = pic_max[9].text #最大页数 if(flag == 1 and len(os.listdir(path+title.strip().replace('?',''))) >= int(pic_max)): print('已经保存完毕,跳过') continue for num in range(1, int(pic_max)+1): pic = href+'/'+str(num) html = requests.get(pic,headers = Hostreferer) mess = BeautifulSoup(html.text,"html.parser") pic_url = mess.find('img',alt = title) print(pic_url['src']) #exit(0) html = requests.get(pic_url['src'],headers = Picreferer) file_name = pic_url['src'].split(r'/')[-1] f = open(file_name,'wb') f.write(html.content) f.close() except Exception: pass print('完成 ') print('第',n,'页完成') 原文参考:https://blog.csdn.net/baidu_35085676/article/details/68958267

2 min · 523 words · Luenci

常用的正则表达式

匹配小数 [ 0 - 9 ] { 1 , } [ . ] [ 0 - 9 ] * 匹配整数 [ 0 - 9 ] 中文的匹配 [ \ u 4 e 0 0 - \ u 9 f a 5 ] ...

3 min · 1232 words · Luenci

数据科学之数据可视化

数据可视化概述 可视化的目的,是对数据进行可视化处理,以更明确地,有效的传递信息。 数据可视化意义 数据可视化是为了从数据中寻找三个方面的信息。 模式。指数据中的规律。 关系。指数据间的相关性。 数据间的比较 数据的构成 数据的分布或联系 异常。指有问题的数据。 ...

3 min · 1460 words · Luenci

数据科学之统计学习

统计学 中心倾向 均值(常用的额) 中位数 分位数:它表示少于数据中特定百分比的一个值 众数 ...

1 min · 418 words · Luenci

查看mysql连接状况

使用mysql- uroot -p登录后 执行命令: show processlist; 查询当前数据库用户连接情况. 如果是root帐号,你能看到所有用户的当前连接. 如果是其它普通帐号,只能看到自己占用的连接. ...

2 min · 685 words · Luenci

模块、迭代器,生成器和装饰器

module模块和包的介绍 模块的介绍 python给我们提供了十分简单的方法去创建一个模块,我们只需要写一个python文件即可,也就是说写一个.py为后缀的文件。 包的介绍 简单来说,包就是多个模块的集合。当项目较大,模块较多时,我们就可以把模块放在包中,便于管理。 我们在包中一般带有__init__.py文件,随你建包的时候就默认生成。 迭代器和生成器 迭代器 迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法: next :返回容器的下一个项目 在3.x的版本中为__next__或者next(可迭代对象) __iter__ : 返回迭代器本身 迭代器可以通过使用一个iter内建函数和一个序列来创建,示例如下。 1 2 3 4 5 6 7 8 In [21]: a = ['a','b', 'c'] In [22]: a = iter(a) In [23]: next(a) Out[23]: 'a' In [24]: a.__next__() Out[24]: 'b' 生成器 生成器 从Python2.2起,生成器提供了一种出色的方法,使得需要返回一系列元素的函数所需的代码更加简单、高效。基于yield指令,可以暂停一个函数并返回中间结果。该函数将保存执行环境并且可以在必要时恢复。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 In [25]: def fibonanci(): ...: a, b = 0, 1 ...: while True: ...: yield b ...: a, b = b, a + b ...: In [26]: fib = fibonanci() In [28]: fib.__next__() Out[28]: 1 In [29]: fib.__next__() Out[29]: 1 In [30]: fib.__next__() Out[30]: 2 In [31]: fib.__next__() yield可以理解为return,每次调用next()就yield值,下次next()从上次的yield处开始运行 该函数将返回一个特殊的迭代器,也就是generator对象,它知道如何保存执行环境。对它的调用是不确定的,每次都将产生序列中的下一个元素。这种语法很简洁,算法的不确定特性并没有影响代码的可读性。不必提供使函数可停止的方法。实际上,这看上去像是用伪代码设计的序列一样。 高阶函数的定义 函数的接收参数是一个函数名 函数的返回值是一个函数名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def father(name): print("I am father %s" %name) def son(): print("i am son") # print(locals()) return son father("luenci") father("luenci")() out: I am father luenci I am father luenci i am son 简单的装饰器 @语法糖:相当于执行下面timmer(test)() i d @ # d t # m e t e e p f i t f s t o m i t i r t d r m m t t p ( m t i e e e m e i r ) m m f t r e s m i e t m u r t e n r i e w s f s p r ( ( . t ( m r r t u w r n t ) s ( t e ( a a n e i e : l " e f p r c i n w s e t s u p t ( g t r t e e t n e _ ) h ( a ) p s ) c r t t " p ( ( t ( ) ( i _ 函 p ) 3 函 ) : ) m t 数 e ) 数 : e i 运 r @ 运 m 行 行 = e 时 语 完 间 法 毕 t = 为 糖 " i : ) m t e i % . m s t e " i . % m t ( e i s ( m w ) e e ( i ) g h t _ t i m e - s t a r t _ t i m e ) ) 带参数的装饰器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import time def timmer(func): def wrapper(*args, **kwargs): print(*args) # print(**kwargs) start_time = time.time() res = func(*args, **kwargs) sweight_time = time.time() print("程序运行时间为:%s" % (sweight_time - start_time)) return res return wrapper @timmer def test(name, age, gender): time.sleep(2) print("我是%s,今年%s,性别%s" % (name, age, gender)) return "sucess" res = test("lusheng", 18, gender="男") # print(res) 装饰器应用案例 登录验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 user_list = [ {"username": "luenci", "pswd": "123"}, {"username": "lynn", "pswd": "456"}, {"username": "lu", "pswd": "789"}, ] current_dic = {"username": None, "login": False} def verify(func): def wrapper(*args, **kwargs): if current_dic['username'] and current_dic['login']: res = func(*args, **kwargs) return res username = input("请输入用户名:").strip() pswd = input("请输入密码:").strip() for user in user_list: if user['username'] == username and user['pswd'] == pswd: current_dic['username'] = username current_dic['login'] = True res = func(*args, **kwargs) return res else: print('用户名或密码错误') return wrapper @verify def shop(): print('我的购物车') @verify def user(): print('我的信息') @verify def things(): print('我的商品') print('登录前的状态:%s'%(current_dic)) user() print('登录后的状态:%s'%(current_dic)) shop() things() 日志记录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import logging import traceback def get_logger(): logger = logging.getLogger("Test") # 设定日志级别,只有大于或等于这个级别才输出 logger.setLevel(level=logging.DEBUG) # 当前路径下创建test_log文件记录错误日志 fh = logging.FileHandler("test_log", encoding='utf-8') ch = logging.StreamHandler() fm = logging.Formatter(fmt='%(asctime)s %(name)s %(pathname)s[%(lineno)d] %(message)s', datefmt='%Y/%m/%d %H:%M:%S') fh.setFormatter(fm) ch.setFormatter(fm) logger.addHandler(fh) logger.addHandler(ch) return logger def decoratore(func): def log(*args,**kwargs): try: print("当前运行方法", func.__name__) return func(*args,**kwargs) except Exception as e: get_logger().error(f"{func.__name__} is error,here are details:{traceback.format_exc()}") return log @decoratore def test(): print(1/0) test() ​ ...

4 min · 1715 words · Luenci

消息队列笔记

消息队列介绍 概念 MQ(Message Queue,消息队列),是基础数据结构中“先进先出”的一种数据结构,是在消息的传输工程中保存消息的容器。多用于分布式系统之间进行通信等。 MQ优势 应用解耦 ...

8 min · 3954 words · Luenci

积善科技(快代理)Python面试总结

积善科技(快代理)Python实习生面试总结 第一面是电话面。简单问了几个问题 1.生成八位字符串的随机验证码 ? 我当时想的是:将字符串存放在字典中,然后用随机函数生成数字,最后通过数字索引来取到对应的字符生成字符串 2.Python中的None和NULL类型 None表示的是空对象,null表示的是空字符串 数据库的问题 条件查询,连表查询等(很久没有用mysql数据库,基本上忘得干干净净,看来以后关系型数据库不能丢啊!!!) 第二面是做了一套笔试题 ...

5 min · 2307 words · Luenci

算法时间复杂度和五大经典排序算法

渐进时间度表 O记法所代表的是渐进上界限,Ω记法代表的是渐进下界 Θ代表的集合是上述符号的交集,Θ(g) = O(g) 常见的渐进运行时间实例 时间复杂度 相关名称 相关实例及说明 Θ(1) 常数级 哈希表的查询和修改 Θ(lg n) 对数级 二分搜索,其对数基数并不重要 Θ(n) 线性级 列表的遍历 Θ(nlgn) 线性对数级 任意值序列的最优化排序,其复杂度等同于Θ(lg n!) Θ(n^2) 平方级 拿n个对象进行互相比对 Θ(n^3) 立方级 Floyd-Warshall算法 O(n^k) 多项式级 基于n的k层嵌套循环(k为整数),且必须满足K > 0 Ω(K^n) 指数级 每n项产生一个子集(其中k = 2),且必须满足K > 1 Θ(n!) 阶乘级 对n个值执行全排列操作 ...

4 min · 1894 words · Luenci

网站概念

网站的组成 目前多数网站由域名,空间服务器,DNS域名解析,网站程序和数据库等组成 ...

2 min · 643 words · Luenci

计算机系统组成及工作原理简介

计算机系统组成及工作原理简介 硬件系统 中央控制器 CPU 运算器 ALU 又称算数逻辑部件,是计算机用来进行数据运算的部件 算数运算 加、减、乘、除四则运算 逻辑运算 与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,亦称算术逻辑部件(ALU) 控制器 Controller ...

1 min · 477 words · Luenci