暂时未有相关云产品技术能力~
Python爬虫要做的是什么?我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 爬虫基本流程:发送请求 ---> 获取响应内容 ---> 解析内容 ---> 保存数据1、发起请求使用http库向目标站点发起请求,即发送一个RequestRequest包含:请求头、请求体等2、获取响应内容如果服务器能正常响应,则会得到一个ResponseResponse包含:html,json,图片,视频等3、解析内容解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等解析json数据:json模块解析二进制数据:以b的方式写入文件4、分类保存数据如:excel表格、数据库文件如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物(数据)。爬虫的定义: 向网站发起请求,获取资源后分析并提取有用数据的程序爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。总结爬虫流程: 爬取--->解析--->存储爬虫所需工具:请求库:requests,selenium解析库:正则,beautifulsoup,pyquery存储库:文件,MySQL,Mongodb,Redis爬虫常用框架: scrapy
Python是如何编译的呢 ?不知道大家有没有了解过,像C/C++这类的编译性語言编写的程序,这种从源代码转化成电子计算机应用的机器语言,历经连接器连接以后产生了二进制的可执行文件。运行该程序的情况下,就可以把二进制程序从电脑硬盘加载到运行内存中并运行。可是针对Python来讲,python源代码不用编译成二进制代码,它能够立即从源码运行程序。在我们运行python文档程序的情况下,python解释器将源码变换为字节码,随后再由python解释器来实行这种字节码。那样,python就不必担心程序的编译或者库的连接、载入等难题了。针对python表述语言,有3种层面的特点:1、每一次运行必须开展转化成字节码,随后还有vm虚拟机把字节码转化成机器语言,最终才可以在硬件配置上运行。与编译性語言对比,每一次空出了编译和连接的全过程,特性毫无疑问会遭受危害。2、因为无需关注程序的编译和库的连接等难题,开发设计的工作中也就更为轻轻松松啦。3、python编码与设备最底层更远了,python程序更为便于移殖,大部分不用修改就能在多服务平台上运行。
这里介绍三种判断文件或文件夹是否存在的方法,分别使用os模块、Try语句、pathlib模块。1.使用os模块os模块中的os.path.exists()方法用于检验文件是否存在。判断文件是否存在import os os.path.exists(test_file.txt) #True os.path.exists(no_exist_file.txt) #False 判断文件夹是否存在import os os.path.exists(test_dir) #True os.path.exists(no_exist_dir) #False可以看出用os.path.exists()方法,判断文件和文件夹是一样。其实这种方法还是有个问题,假设你想检查文件“test_data”是否存在,但是当前路径下有个叫“test_data”的文件夹,这样就可能出现误判。为了避免这样的情况,可以这样:只检查文件import os os.path.isfile("test-data")通过这个方法,如果文件”test-data”不存在将返回False,反之返回True。即是文件存在,你可能还需要判断文件是否可进行读写操作。判断文件是否可做读写操作使用os.access()方法判断文件是否可进行读写操作。语法:os.access(path, mode)path为文件路径,mode为操作模式,有这么几种:os.F_OK: 检查文件是否存在;os.R_OK: 检查文件是否可读;os.W_OK: 检查文件是否可以写入;os.X_OK: 检查文件是否可以执行该方法通过判断文件路径是否存在和各种访问模式的权限返回True或者False。import os if os.access("/file/path/foo.txt", os.F_OK): print("Given file path is exist.") if os.access("/file/path/foo.txt", os.R_OK): print("Given file path is exist.") if os.access("/file/path/foo.txt", os.W_OK): print("Given file path is exist.") if os.access("/file/path/foo.txt", os.X_OK): print "File is accessible to execute"2.使用Try语句可以在程序中直接使用open()方法来检查文件是否存在和可读写。语法:open(<file/path>)如果你open的文件不存在,程序会抛出错误,使用try语句来捕获这个错误。程序无法访问文件,可能有很多原因:如果你open的文件不存在,将抛出一个FileNotFoundError的异常;文件存在,但是没有权限访问,会抛出一个PersmissionError的异常。所以可以使用下面的代码来判断文件是否存在:try: f =open() f.close() except FileNotFoundError: print("File is not found.") except PersmissionError: print("You don't have permission to access this file.")其实没有必要去这么细致的处理每个异常,上面的这两个异常都是IOError的子类。所以可以将程序简化一下: try: f =open() f.close() except IOError: print("File is not accessible.")使用try语句进行判断,处理所有异常非常简单和优雅的。而且相比其他不需要引入其他外部模块。3. 使用pathlib模块pathlib模块在Python3版本中是内建模块,但是在Python2中是需要单独安装三方模块。使用pathlib需要先使用文件路径来创建path对象。此路径可以是文件名或目录路径。检查路径是否存在path = pathlib.Path("path/file") path.exist()检查路径是否是文件 path = pathlib.Path("path/file") path.is_file()
在python的DataFrame中,因为数据中可以有多个行和列。而且每行代表一个数据样本,我们可以将DataFrame看作数据表,那你知道如何按照数据表中的行遍历吗?本文介绍python中按行遍历Dataframe的三种方法:1、iterrows()方法;2、itertuples()方法;3、iteritems()方法。1、iterrows()方法按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]对元素进行访问。for index, row in df.iterrows(): print row["c1"], row["c2"]2、itertuples()方法按行遍历,将DataFrame的每一行迭代为元祖,可以通过row[name]对元素进行访问,比iterrows()效率高。for row in df.itertuples(index=True, name='Pandas'): print getattr(row, "c1"), getattr(row, "c2")3、iteritems()方法按列遍历,将DataFrame的每一列迭代为(列名, Series)对,可以通过row[index]对元素进行访问。for date, row in df.iteritems(): print(date) for date, row in df.iteritems(): print(row) for date, row in df.iteritems(): print(row[0], row[1], row[2])
实现步骤:1、设计界面2、利用循环、多线程来完成抽奖程序设置。import random #导入内置的random模块 list1=list(range(0,15)) #将range元素进行列表转换并赋值给列表list1 print("抽奖号码是:",list1) #打印所有的参与抽奖的号码 list2=[] #定义空列表list2,用来储存中奖号码 while len(list1)>0: result =random.choice(list1) #在列表list1里选择抽取的号码并赋值给result if result in list1 and result%2==0 and result%3==0: print("您的号码是:{},恭喜您,您中一等奖".format(result)) list1.remove(result) list2.append(result) elif result%5==0: print("您的号码是:{},恭喜您,您中了二等奖".format(result)) list1.remove(result) list2.append(result) elif result%3==0: print("您的号码是:{},恭喜您,您中了三等奖".format(result)) list1.remove(result) list2.append(result) elif result%2!=0 and result%3!=0 and result%5!=0: print("您的号码是:{},您未中奖".format(result)) elif result==list1[-1] or result==list1[0]: #当抽取到列表list1最后一个或者第一个元素时 print("您的号码是:{},抽奖结束".format(result)) #打印号码,并打印抽奖结束 print("中奖名单是:", list2) print("未中奖名单是:", list1) Break输出结果:抽奖号码是: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 您的号码是:5,恭喜您,您中了二等奖 您的号码是:10,恭喜您,您中了二等奖 您的号码是:6,恭喜您,您中一等奖 您的号码是:3,恭喜您,您中了三等奖 您的号码是:13,您未中奖 您的号码是:11,您未中奖 您的号码是:14,抽奖结束 中奖名单是: [5, 10, 6, 3] 未中奖名单是: [0, 1, 2, 4, 7, 8, 9, 11, 12, 13, 14]这样一组简单的抽奖程序就设置完成了,感兴趣的小伙伴可以直接套用代码,进入程序里运行,查看实现过程~
split()方法根据分隔符或正则表达式对字符串进行拆分;以逗号分隔的字符串可以用split拆分成数段,可以指定拆分的次数。使用语法Series.str.split(pat=None, n=-1, expand=False)参数pat : 字符串,默认使用空白分割,分列的依据,可以是空格,符号,字符串等等n : 整型,默认为-1,既使用所有的分割点分割。n参数,指定分隔的次数 >>> df[0].str.split('_', n = 1) 0 [A, 1_1] 1 [B, 2_1] 2 [C, 3_1] 3 [D, 4_1] Name: 0, dtype: objectexpand : 布尔值,默认为False。可以指定拆分的次数如果为真返回数据框(DataFrame)或复杂索引(MultiIndex);如果为假,返回序列(Series)或者索引(Index).返回值expand参数:每个具体值的类型是字符串实例>>> import numpy,pandas; >>> s = pandas.Series([‘a_b_c‘, ‘c_d_e‘, numpy.nan, ‘f_g_h‘]) >>> s.str.split(‘‘) 0 [a, b, c] 1 [c, d, e] 2 NaN 3 [f, g, h] dtype: object >>> s.str.split(‘‘, -1) 0 [a, b, c] 1 [c, d, e] 2 NaN 3 [f, g, h] dtype: objectpython中有一系列内置的方法可以进行字符串操作,例如使用split()方法粉格子风,同样作为python中的pandas库也可以使用内置方法split()方法分割字符串,但是split()方法不能分割字符串分列,要想分列,需要先用.str将这一列转换为类似字符串的格式,就能够使用split()方法。以上就是pandas中使用split()方法分割字符串得详细介绍,需要注意如果直接用某一列和split()来分列是不行的,因为Series数据类型是没有split()的,所以需要先用.str将这一列转换为类似字符串的格式,就能够使用split()了
使用场景比如你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制,python服务成了终端程序的一个子进程。因此如果你关闭了终端,这个命令行程序也会随之关闭。要使你的python服务不受终端影响而常驻系统,就需要将它变成守护进程。守护进程就是Daemon程序,是一种在系统后台执行的程序,它独立于控制终端并且执行一些周期任务或触发事件,通常被命名为"d"字母结尾,如常见的httpd、syslogd、systemd和dockerd等。代码讲解python可以很简洁地实现守护进程,下面给出代码和相应注释。这份代码稳定运行在我本地电脑的一个守护进程(自制闹钟)里,暂时没出过问题。# coding=utf8 import os import sys import atexit def daemonize(pid_file=None): """ 创建守护进程 :param pid_file: 保存进程id的文件 :return: """ # 从父进程fork一个子进程出来 pid = os.fork() # 子进程的pid一定为0,父进程大于0 if pid: # 退出父进程,sys.exit()方法比os._exit()方法会多执行一些刷新缓冲工作 sys.exit(0) # 子进程默认继承父进程的工作目录,最好是变更到根目录,否则回影响文件系统的卸载 os.chdir('/') # 子进程默认继承父进程的umask(文件权限掩码),重设为0(完全控制),以免影响程序读写文件 os.umask(0) # 让子进程成为新的会话组长和进程组长 os.setsid() # 注意了,这里是第2次fork,也就是子进程的子进程,我们把它叫为孙子进程 _pid = os.fork() if _pid: # 退出子进程 sys.exit(0) # 此时,孙子进程已经是守护进程了,接下来重定向标准输入、输出、错误的描述符(是重定向而不是关闭, 这样可以避免程序在 print 的时候出错) # 刷新缓冲区先,小心使得万年船 sys.stdout.flush() sys.stderr.flush() # dup2函数原子化地关闭和复制文件描述符,重定向到/dev/nul,即丢弃所有输入输出 with open('/dev/null') as read_null, open('/dev/null', 'w') as write_null: os.dup2(read_null.fileno(), sys.stdin.fileno()) os.dup2(write_null.fileno(), sys.stdout.fileno()) os.dup2(write_null.fileno(), sys.stderr.fileno()) # 写入pid文件 if pid_file: with open(pid_file, 'w+') as f: f.write(str(os.getpid())) # 注册退出函数,进程异常退出时移除pid文件 atexit.register(os.remove, pid_file)概括一下守护进程的编写步骤:1、fork出子进程,退出父进程2、子进程变更工作目录(chdir)、文件权限掩码(umask)、进程组和会话组(setsid)3、子进程fork孙子进程,退出子进程4、孙子进程刷新缓冲,重定向标准输入/输出/错误(一般到/dev/null,意即丢弃)5、(可选)pid写入文件要点理解为什么要fork两次第一次fork,是为了脱离终端控制的魔爪。父进程之所以退出,是因为终端敲击键盘、或者关闭时给它发送了信号;而fork出来的子进程,在父进程自杀后成为孤儿进程,进而被操作系统的init进程接管,因此脱离终端控制。所以其实,第二次fork并不是必须的(很多开源项目里的代码就没有fork两次)。只不过出于谨慎考虑,防止进程再次打开一个控制终端。因为子进程现在是会话组长了(对话期的首次进程),有能力打开控制终端,再fork一次,孙子进程就不能打开控制终端了。文件描述符Linux是“一切皆文件”,文件描述符是内核为已打开的文件所创建的索引,通常是非负整数。进程通过文件描述符执行IO操作。每个进程有自己的文件描述符表,因此相同的描述符可能指向同一个文件,也可能指向不同文件;来自不同进程的不同的描述符,当然也有可能指向同一个文件。默认情况下,0代表标准输入,1代表标准输出,2代表标准错误。umask权限掩码我们知道,在Linux中,任何一个文件都有读(read)、写(write)和执行(execute)的三种使用权限。其中,读的权限用数字4代表,写权限是2,执行权限是1。命令ls -l可以查看文件权限,r/w/x分别表示具有读/写/执行权限。任何文件,也都有用户(User),用户组(Group),其他组(Others)三种身份权限。一般用3个数字表示文件权限,例如754:7,是User权限,即文件拥有者权限5,是Group权限,拥有者所在用户组的组员所具有的权限4,是Others权限,即其他组用户的权限啦而umask是为了控制默认权限,防止新建文件或文件夹具有全权。系统一般默认为022(使用命令umask查看),表示默认创建文件的权限是644,文件夹是755。你应该可以看出它们的规律,就是文件权限和umask的相加结果为666(笑),文件夹权限和umask的相加结果为777。进程组每个进程都属于一个进程组(PG,Process Group),进程组可以包含多个进程。进程组有一个进程组长(Leader),进程组长的ID(PID, Process ID)就作为整个进程组的ID(PGID,Process Groupd ID)。会话组登陆终端时,就会创造一个会话,多个进程组可以包含在一个会话中。而创建会话的进程,就是会话组长。已经是会话组长的进程,不可以再调用setsid()方法创建会话。因此,上面代码中,子进程可以调用setsid(),而父进程不能,因为它本身就是会话组长。另外,sh(Bourne Shell)不支持会话机制,因为会话机制需要shell支持工作控制(Job Control)。守护进程与后台进程通过&符号,可以把命令放到后台执行。它与守护进程是不同的:1、守护进程与终端无关,是被init进程收养的孤儿进程;而后台进程的父进程是终端,仍然可以在终端打印2、守护进程在关闭终端时依然坚挺;而后台进程会随用户退出而停止,除非加上nohup3、守护进程改变了会话、进程组、工作目录和文件描述符,后台进程直接继承父进程(shell)的换句话说:守护进程就是默默地奋斗打拼的有为青年,而后台进程是默默继承老爸资产的富二代。
在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来。这种情况下,如果执行的顺序不对,很容易在执行migrate的时候出现数据库已存在的错误:django.db.utils.OperationalError: (1050, "Table 'xxx' already exists")要处理这种情况,如果是数据表都已经存在了,在migrate时直接使用 --fake-initial 来处理python manage.py migrate --fake-initial如果是因有外键存在,需要初始化多个表,且有部分数据表已创建,又有部分未创建,可以使用 --fake 来处理python manage.py migrate --fake <appname>参考资料:https://stackoverflow.com/questions/25924858/django-1-7-migrate-gets-error-table-already-exists
Python中关键词有多少个?Python中关键词目前有31个,可以利用Python的内置的keyword模块进行输出查看。keyword模块 Help on module keyword: NAME keyword - Keywords (from "graminit.c") FILE /usr/lib64/python2.6/keyword.py DESCRIPTION This file is automatically generated; please don't muck it up! To update the symbols in this file, 'cd' to the top directory of the python source tree after building the interpreter and run: python Lib/keyword.py FUNCTIONS iskeyword = __contains__(...) x.__contains__(y) y in x. DATA __all__ = ['iskeyword', 'kwlist'] kwlist = ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', ...得到python的关键字列表:>>> keyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']判断字符串是否是python的关键字>>> keyword.iskeyword('and') True >>> >>> keyword.iskeyword('has') False
跨平台的GUI工具库,较为有名的当属GTK+、Qt 和 wxWidgets 了。GTK+是C实现的,由于C语言本身不支持OOP,因而GTK+上手相当困难,写起来也较为复杂艰涩。Qt 和 wxWidgets 则是C++实现的,各自拥有庞大的用户群体。这里客观地搜集了关于Qt 和 wxWidgets 的对比评价。关于LICENSEQt最初由芬兰的TrollTech公司研发,现在属于Nokia(没看错,就是曾经闻名遐迩的手机巨头诺基亚),它的背后一直由商业公司支持,奉行的是双 license 策略,一个是商业版,一个是免费版。这个策略严重限制了Qt的用户群体。据说Nokia收购之后意识到了这个问题,自4.5版本之后采用了LGPL,开发人员可以发布基于免费Qt库的商业软件了。wxWidgets最开始是由爱丁堡(Edinburgh)大学的人工智能应用学院开发的,在1992年开源,一直遵循LGPL。wxWidgets从一开始就是程序员的免费午餐。关于兼容性由于Qt使用的是非标准C++,与其它库的兼容性会存在问题,在每个平台的图形界面也并不完全是原生界面( Native GUI),只是透过 theme 去模拟系統上的标准 GUI,所以看起來很像,有些地方则会明显看出破綻。 Qt的执行速度缓慢且过于庞大则是另一个问题。wxWidgets使用的是标准C++,与现有各类工具库无缝连接,在不同平台上也是完全Native GUI,是真正的跨平台。关于服务和支持由于Nokia的接盘,Qt提供了一系列完整的文档和RAD工具,并提供最为完整的平台支持,对于移动终端的支持最为完善。Qt库也是所有的GUI工具库中最为面向对象化的,同时也是最为稳定的。wxWidgets因为缺乏很好的商业化支持,开发文档、资源相对较为匮乏。由于是偏重考虑MFC程序的跨平台迁移,wxWidgets面向对象封装做得差强人意。wxWidgets的主体是由C++构建的,但你并不是必需通过C++才能使用它。wxWidgets拥有许多其它语言的绑定(binding),比如 wxPerl,wxJava,wxBasic,wxJavaScript,wxRuby等等,wxPython 就是 Python语言的 wxWidgets 工具库。
Python有许多吸引力,如效率,代码可读性和速度,使其成为数据科学爱好者的首选编程语言。Python通常是希望升级其应用程序功能的数据科学家和机器学习专家的首选。由于其广泛的用途,Python拥有大量的库,使数据科学家可以更轻松地完成复杂的任务,而无需很多编写代码的麻烦。以下是数据科学的前3个Python库。使用这些库将Python转化为一个科学的数据分析和建模工具。1.NumPyNumPy(Numerical Python的缩写)是配备有用资源的顶级库之一,可帮助数据科学家将Python转变为强大的科学分析和建模工具。流行的开源库可以在BSD许可下使用。它是用于在科学计算中执行任务的基础Python库。NumPy是一个更大的基于Python的开源工具生态系统的一部分,称为SciPy。他的库为Python提供了大量的数据结构,可以毫不费力地执行多维数组和矩阵计算。除了用于求解线性代数方程和其他数学计算外,NumPy还可用作不同类型通用数据的通用多维容器。此外,它与其他编程语言(如C / C ++和Fortran)完美集成。NumPy库的多功能性使其能够轻松快速地与各种数据库和工具结合使用。2.PandasPandas是另一个很棒的库,可以增强你的数据科学Python技能。与NumPy一样,它属于SciPy开源软件系列,可在BSD免费软件许可下使用。Pandas提供多功能和强大的工具,用于整理数据结构和执行大量数据分析。该库适用于不完整,非结构化和无序的实际数据,并附带用于整形,聚合,分析和可视化数据集的工具。此库中有三种类型的数据结构:Series:单维,均匀阵列DataFrame:具有异构类型列的二维Panel:三维,大小可变阵列例如,让我们看看Panda Python库(缩写为pd)可用于执行一些描述性统计计算。让我们从导入库开始。import pandas pd让我们创建一个系列词典。d 'Name':pd.Series'Alfrick''Michael''Wendy''Paul''Dusan''George''Andreas' 'Irene''Sagar''Simon''James''Rose' 'Years of Experience':pd.Series 'Programming Language':pd.Series'Python''JavaScript''PHP''C++''Java''Scala''React''Ruby''Angular''PHP''Python''JavaScript'让我们创建一个DataFrame。df pd.DataFramed下面是一个很好的输出表:Name Programming Language Years of Experience Alfrick Python Michael JavaScript Wendy PHP Paul C++ Dusan Java George Scala Andreas React Irene Ruby Sagar Angular Simon PHP James Python Rose JavaScript 下面是这个示例的全部代码:import pandas pd #creating a dictionary of series d 'Name':pd.Series'Alfrick''Michael''Wendy''Paul''Dusan''George''Andreas' 'Irene''Sagar''Simon''James''Rose' 'Years of Experience':pd.Series 'Programming Language':pd.Series'Python''JavaScript''PHP''C++''Java''Scala''React''Ruby''Angular''PHP''Python''JavaScript' #Create a DataFrame df pd.DataFramed print(df)3.MatplotlibMatplotlib也是SciPy核心软件包的一部分,并在BSD许可下提供。它是一个流行的Python科学库,用于生成简单而强大的可视化。你可以使用Python框架进行数据科学生成创意图形,图表,直方图以及其他形状和图形,而无需担心编写多行代码。例如,让我们看看如何使用Matplotlib库创建一个简单的条形图。让我们从导入库开始。matplotlib import pyplot plt让我们为x轴和y轴生成值。让我们调用绘制条形图的函数。plt.xy让我们展示一下情节。plt.这是条形图: #importing Matplotlib Python library matplotlib import pyplot plt #same as import matplotlib.pyplot as plt #generating values for x-axis x #generating vaues for y-axis y #calling function for plotting the bar chart plt.xy #showing the plot plt.Python编程语言在数据处理和准备方面做得很好,但对于复杂的科学数据分析和建模却不那么重要。用于数据科学的顶级Python框架有助于填补这一空白,允许你执行复杂的数学计算并创建能够理解数据的复杂模型。
思路(1)open()文件迭代器,读取文件的每行,不过这个会自动在读取的对象后面增加一个跨行符号\n(2)判断是否有敏感词。(3)将敏感词替换成*代码# 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights def filtered_words(): user_words = input('Please input your words:') for f in open('D:/filtered_words.txt'): #open()文件迭代器,读取文件的每行,不过这个会自动在读取的对象后面增加一个跨行符号\n if f.rstrip() in user_words:#rstrip()可以去掉右边的跨行符 #判断是否有敏感词。in成员测试in print('Freedom') break else: print('Human Rights') if __name__ == '__main__': filtered_words() 敏感词替换成*# 将上述的敏感词替换成*** def filtered_words(): user_words = input('Please input your words:') for f in open('D:/filtered_words.txt'): #open()文件迭代器,读取文件的每行,不过这个会自动在读取的对象后面增加一个跨行符号\n fw = f.rstrip()#rstrip()可以去掉右边的跨行符 if fw in user_words:#判断是否有敏感词。in成员测试in f = len(fw) user_input = user_words.replace (fw,'***'*f) else: print(user_input) if __name__ == '__main__': filtered_words()
在我们想要对不同变量进行判断的时候,会分析其中的之间的联系。这种理念同样也被用在实例生活中,最常见到的是做一个地理的热力图。很多人对画热力图的方法不是很清楚,我们可以先装好相关的工具,了解一些使用参数,然后在实例中进行画热力图的实例体验,下面就来看看具体的方法吧。导入相关模块import gmplot import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns 参数的介绍sns.set(font_scale=1.5)vmax:设置颜色带的最大值vmin:设置颜色带的最小值cmap:设置颜色带的色系center:设置颜色带的分界线annot:是否显示数值注释fmt:format的缩写,设置数值的格式化形式linewidths:控制每个小方格之间的间距linecolor:控制分割线的颜色cbar_kws:关于颜色带的设置mask:传入布尔型矩阵,若为矩阵内为True,则热力图相应的位置的数据将会被屏蔽掉(常用在绘制相关系数矩阵图)代码用Python生成heatmap比较简单,导入googlmap然后把经纬度plot在地图上就可以了。最后把heatmap生成为一个html文件,可以放大和缩小。df = pd.read_csv("data.csv") df = pd.DataFrame(df) df_td = pd.read_csv("datacopy.csv") df_td = pd.DataFrame(df_td) # print df.dtypes print (df.shape) print (df_td.shape) def plot_heat_map(data, number): latitude_array = data['INTPTLAT'].values latitude_list = latitude_array.tolist() print(latitude_list[0]) Longitude_array = data['INTPTLONG'].values longitude_list = Longitude_array.tolist() print(longitude_list[0]) # Initialize the map to the first location in the list gmap = gmplot.GoogleMapPlotter(latitude_list[0], longitude_list[0], 10) # gmap.scatter(latitude_list, longitude_list, edge_width=10) gmap.heatmap(latitude_list, longitude_list) # Write the map in an HTML file # gmap.draw('Paths_map.html') gmap.draw('{}_Paths_map.html'.format(number)) plot_heat_map(df,'4')
class BinaryTree: def __init__(self,rootObj): self.root = rootObj self.leftChild = None self.rightChild = None def insertLeft(self,newNode): if self.leftChild == None: self.leftChild = BinaryTree(newNode) else: print('The leftChild is not None.You can not insert') def insertRight(self,newNode): if self.rightChild == None: self.rightChild = BinaryTree(newNode) else: print('The rightChild is not None.You can not insert') 构建了一个简单的二叉树类,它的初始化函数,将传入的rootObj赋值给self.root,作为根节点,leftChild和rightChild都默认为None。函数insertLeft为向二叉树的左子树赋值,若leftChild为空,则先构造一个BinaryTree(newNode),即实例化一个新的二叉树,然后将这棵二叉树赋值给原来的二叉树的leftChild。此处递归调用了BinaryTree这个类。若不为空 则输出:The rightChild is not None.You can not insert执行下述语句r = BinaryTree('a') print('root:',r.root,';','leftChild:',r.leftChild,';','rightChild:',r.rightChild)root: a ; leftChild: None ; rightChild: None即我们构造了一颗二叉树,根节点为a,左右子树均为None然后执行下述语句···r.insertLeft('b')print('root:',r.root,';','leftChild:',r.leftChild,';','rightChild:',r.rightChild)print('root:',r.root,';','leftChild.root:',r.leftChild.root,';','rightChild:',r.rightChild)··· # 输出 root: a ; leftChild: <__main__.BinaryTree object at 0x000002431E4A0DA0> ; rightChild: None root: a ; leftChild.root: b ; rightChild: None我们向r插入了一个左节点,查看输出的第一句话,可以看到左节点其实也是一个BinaryTree,这是因为插入时,递归生成的。第二句输出,可以查看左节点的值最后执行r.insertLeft('c')输出: The leftChild is not None.You can not insert可以看到,我们无法再向左节点插入了,因为该节点已经有值了
import subprocess,sys,os import re class CutSplicingVdeio(object): def __init__(self): pass #dercription CutSplicingVdeio this class function def instructions(self): dercription="vdeio and image transform,vdeio other opreation" return dercription def transcribeScreen(self,filePath): filePath=filePath.decode('utf-8') cmd=ffmpegPath + " -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 1366x768 -i desktop " + filePath cmd=cmd.encode(sys.getfilesystemencoding()) if "?" in cmd: cmd=cmd.replace("?","") print cmd subprocess.call(cmd , shell=True) vp=CutSplicingVdeio() vp.transcribeScreen(r"C:\Users\Administrator\Desktop\transcribe.avi") # according to give a video filepath (transcribe Screen)首先,写了一个api,里面的的一个录制屏幕的功能,其他的暂时没写,以后再分享。vp.transcribeScreen传递路径后执行transcribeScreen,为让中文显示正常转换一下编码格式,之后执行cmd命令即可。win7系统执行后报错,不知原因,排产原因是在路径里多出一个?,去除之后,完美运行。也可以直接通过cmd运行 D:\LenovoC\ffmpeg\bin\ffmpeg.exe -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 1366x768 -i desktop C:\Users\Administrator\Desktop\transcribe.avi。
Python实现的根据文件名查找数据文件功能import os import shutil AllFiles=[] NameFiles=[] def findFie(filePath): pathDir = os.listdir(filePath) for allDir in pathDir: # print(allDir) AllFiles.append(allDir) #pass #filepath = 'C:\\Users\\IBM_ADMIN\\Desktop\\cognos\\datastage\\71&72\\71\\71sns' #copyfile = 'C:\\Users\\IBM_ADMIN\\Desktop\\cognos\\datastage\\71&72\\71mtp' filepath = 'C:\\Users\\IBM_ADMIN\\Desktop\\cognos\\datastage\\71&72\\72\\72sns' copyfile = 'C:\\Users\\IBM_ADMIN\\Desktop\\cognos\\datastage\\71&72\\72mtp' shutil.rmtree(copyfile) os.mkdir(copyfile) findFie(filepath) def readFile(): readFile = open('./jobname') i = 0 for eachLine in readFile: i= i + 1 #print(eachLine) NameFiles.append(eachLine.replace('\n','')) # 去掉换行符 readFile() #字符串比较 def doTheCompare(): for x in NameFiles: print(x) for y in AllFiles: if x == y : copyFrom = os.path.join(filepath,x) copyTo = os.path.join(copyfile,x) shutil.copyfile(copyFrom,copyTo) else: pass #print ("file not find under sns process,thanks .please check with wumi.") doTheCompare()这里再补充一个更为简单的文件搜索功能:import os def search(path=".", name="1"): for item in os.listdir(path): item_path = os.path.join(path, item) if os.path.isdir(item_path): search(item_path, name) elif os.path.isfile(item_path): if name in item: print(item_path) if __name__ == "__main__": search(path=r"D:\360Downloads",name="dll")
city.json文件的内容如下:{ "cities": [ { "city": "北京", "cityid": "101010100" }, { "city": "上海", "cityid": "101020100" } ] } 其中包含了中文。Python使用json.loads之后打印中文会出现乱码的问题;解决方法: with open('city.json', 'r') as json_file: """ 读取该json文件时,先按照gbk的方式对其解码再编码为utf-8的格式 """ data = json_file.read().decode(encoding='gbk').encode(encoding='utf-8') print type(data) # type(data) = 'str' result = json.loads(data) new_result = json.dumps(result,ensure_ascii=False) # 参考网上的方法,***ensure_ascii***设为False print new_result # 输出结果: # "cities": [{"cityid": "101010100", "city": "北京"}, {"cityid": "101020100", "city": "上海"}]PS:这里再为大家推荐几款比较实用的json在线工具供大家参考使用:在线JSON代码检验、检验、美化、格式化工具:http://tools.jb51.net/code/jsonJSON在线格式化工具:http://tools.jb51.net/code/jsonformat在线XML/JSON互相转换工具:http://tools.jb51.net/code/xmljsonjson代码在线格式化/美化/压缩/编辑/转换工具:http://tools.jb51.net/code/jsoncodeformat在线json压缩/转义工具:http://tools.jb51.net/code/json_yasuo_trans
使用telnetlib模块,首先登录到交换机,列出并获取配置文件的名称,然后通过tftp协议将配置文件传输到文件服务器上,为避免配置文件覆盖,将备份的配置文件名称统一加入日期以作区分。登录方式和口令有好几种,比较懒惰,通过不同列表以做区分,如果每个交换机口令都不相同的话,就需要额外处理了。交换机的配置文件也有多种类型,也是通过列表进行区分。有些交换机支持ftp和sftp,但测试发现有些虽然有相应的客户端命令,但传输总有问题。也不能将每个交换机都配置为ftp服务器,不安全也不方便。最后采用tftp解决。tftp比较简单,没有办法创建目录以区分不同日期的备份。好在配置文件已经加入了日期做区分,马马虎虎可以运行了。import telnetlib,sys from datetime import date today=date.today() print(today) ipaddrset1=['192.168.1.19','192.168.1.29','192.168.1.59'] ipaddrset2=['192.168.1.39','192.168.1.49','192.168.1.69','192.168.1.56','192.168.1.6','192.168.1.9','192.168.1.24', '192.168.1.72','192.168.1.73','192.168.1.74','192.168.1.75','192.168.1.76','192.168.1.41','192.168.1.16','192.168.1.32',] ipaddrset3=['192.168.1.51','192.168.1.52','192.168.1.53','192.168.1.54','192.168.1.55', '192.168.1.15','192.168.1.16','192.168.1.22','192.168.1.23','192.168.1.25','192.168.1.26','192.168.1.27', '192.168.1.28','192.168.1.7'] hostname='192.168.8.201' tn=telnetlib.Telnet(hostname) print(tn.read_until(b'Username:').decode('ascii')) tn.write(b'**********\n') print(tn.read_until(b'Password:').decode('ascii')) tn.write(b'************\n') print(tn.read_until(b'>').decode('ascii')) for ipaddr in ipaddrset1: telnet_dest="telnet "+ipaddr tn.write(telnet_dest.encode('ascii')+b'\n') tn.read_until(b'Password:').decode('ascii') tn.write(b'**********\n') tn.read_until(b'>').decode('ascii') tn.write(b'dir\n') tn.read_until(b'>').decode('ascii') fn=str(today)+"_"+str(ipaddr)+"_vrpcfg.zip \n" cmdli="tftp 192.168.5.33 put vrpcfg.zip " +str(fn) tn.write(cmdli.ede('ascii')) tmp=tn.read_until(b'>').decode('ascii') if "successfully" in tmp: print(str(ipaddr)+" backup successfully!") else: print(str(ipaddr)+" backup NOT successfully!") tn.write(b'quit\n') tn.read_until(b'>') for ipaddr in ipaddrset2: telnet_dest="telnet "+ipaddr tn.write(telnet_dest.encode('ascii')+b'\n') tn.read_until(b'Password:').decode('ascii') tn.write(b'**********\n') tn.read_until(b'>').decode('ascii') tn.write(b'dir\n') tn.read_until(b'>').decode('ascii') fn=str(today)+"_"+str(ipaddr)+"_startup.cfg \n" cmdli="tftp 192.168.5.33 put startup.cfg " +str(fn) tn.write(cmdli.encode('ascii')) tmp=tn.read_until(b'>').decode('ascii') if "successfully" in tmp: print(str(ipaddr)+" backup successfully!") else: print(str(ipaddr)+" backup NOT successfully!") tn.write(b'quit\n') tn.read_until(b'>') for ipaddr in ipaddrset3: telnet_dest="telnet "+ipaddr tn.write(telnet_dest.encode('ascii')+b'\n') tn.read_until(b'Password:').decode('ascii') tn.write(b'************\n') tn.read_until(b'>').decode('ascii') tn.write(b'dir\n') tn.read_until(b'>').decode('ascii') fn=str(today)+"_"+str(ipaddr)+"_startup.cfg \n" cmdli="tftp 192.168.5.33 put startup.cfg " +str(fn) tn.write(cmdli.encode('ascii')) tmp=tn.read_until(b'>').decode('ascii') if "successfully" in tmp: print(str(ipaddr)+" backup successfully!") else: print(str(ipaddr)+" backup NOT successfully!") tn.write(b'quit\n') tn.read_until(b'>') tn.write(b'exit\n') tn.close()
这里需要用到两个文件,从github下载: https://github.com/csdz/nstools/tree/master/zhtools下载源文件:zh_wiki.py 和 langconv.py转换函数:from langconv import * def tradition2simple(line): # 将繁体转换成简体 line = Converter('zh-hans').convert(line.decode('utf-8')) line = line.encode('utf-8') return line def tradition2simple2(line): # 将繁体转换成简体 line = Converter('zh-hans').convert(line) line = line.encode('utf-8') return line a = tradition2simple2(u"無所謂") print(a) # 结果 无所谓
学习Python爬虫要做什么?我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 只不过,用户获取网络数据的方式是:浏览器提交请求 -> 下载网页代码 -> 解析/渲染成页面。而爬虫程序要做的是:模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 爬虫基本流程发送请求---》获取响应内容---》解析内容---》保存数据发起请求使用http库向目标站点发起请求,即发送一个RequestRequest包含:请求头、请求体等;获取响应内容如果服务器能正常响应,则会得到一个ResponseResponse包含:html,json,图片,视频等;解析内容解析html数据:正则表达式;第三方解析库 如:Beautifulsoup、pyquery等;解析json数据:json模块;解析二进制数据: 以b的方式写入文件保存数据、数据库文件如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据。爬虫的定义: 向网站发起请求,获取资源后分析并提取有用数据的程序爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。总结爬虫流程:爬取 --> 解析 --> 存储爬虫所需工具:请求库:requests,selenium ;解析库:正则,beautifulsoup,pyquery ;存储库:文件,MySQL,Mongodb,Redis;4.爬虫常用框架: Scrapy;
import matplotlib.pyplot as plt import numpy as np x = np.arange(0., np.e, 0.01) y1 = np.exp(-x) y2 = np.log(x) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(x, y1,'r',label="right"); ax1.legend(loc=1) ax1.set_ylabel('Y values for exp(-x)'); ax2 = ax1.twinx() # this is the important function ax2.plot(x, y2, 'g',label = "left") ax2.legend(loc=2) ax2.set_xlim([0, np.e]); ax2.set_ylabel('Y values for ln(x)'); ax2.set_xlabel('Same X for both exp(-x) and ln(x)'); plt.show()
爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据;改变url_header和url_tail即可爬取特定的其他数据。import sys reload(sys) sys.setdefaultencoding('utf-8') import requests import time import urllib from bs4 import BeautifulSoup import re from pyExcelerator import * def getURLLists(url_header,url_tail,pages): """ 获取所有页面的URL列表 """ url_lists = [] url_0 = url_header+'0'+url_tail print url_0 url_lists.append(url_0) for i in range(1,pages+1): url_temp = url_header+str(i)+url_tail url_lists.append(url_temp) return url_lists def getNBAAllData(url_lists): """ 获取所有2017赛季NBA常规赛数据 """ datasets = [''] for item in url_lists: data1 = getNBASingleData(item) datasets.extend(data1) #去掉数据里的空元素 for item in datasets[:]: if len(item) == 0: datasets.remove(item) return datasets def getNBASingleData(url): """ 获取1个页面NBA常规赛数据 """ # url = 'http://stat-nba.com/query_team.php?QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017' # html = requests.get(url).text html = urllib.urlopen(url).read() # print html soup = BeautifulSoup(html) data = soup.html.body.find('tbody').text list_data = data.split('\n') # with open('nba_data.txt','a') as fp: # fp.write(data) # for item in list_data[:]: # if len(item) == 0: # list_data.remove(item) return list_data def saveDataToExcel(datasets,sheetname,filename): book = Workbook() sheet = book.add_sheet(sheetname) sheet.write(0,0,u'序号') sheet.write(0,1,u'球队') sheet.write(0,2,u'时间') sheet.write(0,3,u'结果') sheet.write(0,4,u'主客') sheet.write(0,5,u'比赛') sheet.write(0,6,u'投篮命中率') sheet.write(0,7,u'命中数') sheet.write(0,8,u'出手数') sheet.write(0,9,u'三分命中率') sheet.write(0,10,u'三分命中数') sheet.write(0,11,u'三分出手数') sheet.write(0,12,u'罚球命中率') sheet.write(0,13,u'罚球命中数') sheet.write(0,14,u'罚球出手数') sheet.write(0,15,u'篮板') sheet.write(0,16,u'前场篮板') sheet.write(0,17,u'后场篮板') sheet.write(0,18,u'助攻') sheet.write(0,19,u'抢断') sheet.write(0,20,u'盖帽') sheet.write(0,21,u'失误') sheet.write(0,22,u'犯规') sheet.write(0,23,u'得分') num = 24 row_cnt = 0 data_cnt = 0 data_len = len(datasets) print 'data_len:',data_len while(data_cnt< data_len): row_cnt += 1 print '序号:',row_cnt for col in range(num): # print col sheet.write(row_cnt,col,datasets[data_cnt]) data_cnt += 1 book.save(filename) def writeDataToTxt(datasets): fp = open('nba_data.txt','w') line_cnt = 1 for i in range(len(datasets)-1): #球队名称对齐的操作:如果球队名字过短或者为76人队是 球队名字后面加两个table 否则加1个table if line_cnt % 24 == 2 and len(datasets[i]) < 5 or datasets[i] == u'费城76人': fp.write(datasets[i]+'\t\t') else: fp.write(datasets[i]+'\t') line_cnt += 1 if line_cnt % 24 == 1: fp.write('\n') fp.close() if __name__ == "__main__": pages = int(1132/150) url_header = 'http://stat-nba.com/query_team.php?page=' url_tail = '&QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017#label_show_result' url_lists = getURLLists(url_header,url_tail,pages) datasets = getNBAAllData(url_lists) writeDataToTxt(datasets) sheetname = 'nba normal data 2016-2017' str_time = time.strftime('%Y-%m-%d',time.localtime(time.time())) filename = 'nba_normal_data'+str_time+'.xls' saveDataToExcel(datasets,sheetname,filename)
网上有许多代理ip,免费的、付费的。大多数公司爬虫会买这些专业版,对于普通人来说,免费的基本满足我们需要了,不过免费有一个弊端,时效性不强,不稳定,所以我们就需要对采集的ip进行一个简单的验证。1.目标采集西刺代理,这个网站很早之前用过,不过那个时候它还提供免费的api,现在api暂不提供了,我们就写个简单的爬虫去采集。打开西刺代理,然后选择高匿代理。按下F12进入抓包工具;查看network,不难发现,每个ip地址都在td标签中,对于我们来说就简单许多了,初步的想法就是获取所有的ip,然后校验可用性,不可用就剔除。通过re定义匹配规则import re ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口2.校验 这里我们选用淘宝的ip地址库检验可用性关于淘宝IP地址库目前提供的服务包括:根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家、省、市和运营商。用户可以根据自己所在的位置和使用的IP地址更新我们的服务内容。我们的优势:提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范。提供完善的统计分析报表,省准确度超过99.8%,市准确度超过96.8%,数据质量有保障。接口说明请求接口(GET):ip.taobao.com/service/get…例:http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44响应信息:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商返回数据格式:{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317", "region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1", "country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000", "county_id":"-1","isp_id":"100017"}}其中code的值的含义为,0:成功,1:失败。PS:为了保障服务正常运行,每个用户的访问频率需小于10qps。我们先通过浏览器测试一下输入地址 http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44再次输入一个地址 http://ip.taobao.com/service/getIpInfo2.php?ip=112.85.168.98代码核心片段import requests check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip=" api = check_api + ip try: response = requests.get(url=api, headers=api_headers, timeout=2) print("ip:%s 可用" % ip) except Exception as e: print("此ip %s 已失效:%s" % (ip, e))源代码代码中加入了异常处理,其实如果是自己手写的demo写不写异常处理都可以,但是为了方便其他人调试,建议在可能出现异常的地方加入异常处理。import requests import re import random from bs4 import BeautifulSoup ua_list = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36", "Mozilla / 5.0(Windows NT 6.1;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 45.0.2454.101Safari / 537.36" ] def ip_parse_xici(page): """ :param page: 采集的页数 :return: """ ip_list = [] for pg in range(1, int(page)): url = 'http://www.xicidaili.com/nn/' + str(pg) user_agent = random.choice(ua_list) my_headers = { 'Accept': 'text/html, application/xhtml+xml, application/xml;', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Referer': 'http: // www.xicidaili.com/nn', 'User-Agent': user_agent } try: r = requests.get(url, headers=my_headers) soup = BeautifulSoup(r.text, 'html.parser') except requests.exceptions.ConnectionError: print('ConnectionError') else: data = soup.find_all('td') # 定义IP和端口Pattern规则 ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口 ips = re.findall(ip_compile, str(data)) # 获取所有IP ports = re.findall(port_compile, str(data)) # 获取所有端口 check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip=" for i in range(len(ips)): if i < len(ips): ip = ips[i] api = check_api + ip api_headers = { 'User-Agent': user_agent } try: response = requests.get(url=api, headers=api_headers, timeout=2) print("ip:%s 可用" % ip) except Exception as e: print("此ip %s 已失效:%s" % (ip, e)) del ips[i] del ports[i] ips_usable = ips ip_list += [':'.join(n) for n in zip(ips_usable, ports)] # 列表生成式 print('第{}页ip采集完成'.format(pg)) print(ip_list) if __name__ == '__main__': xici_pg = input("请输入需要采集的页数:") ip_parse_xici(page=xici_pg)为你的爬虫加入代理ip建议大家把采集到的ip存入数据库,这样每次爬虫的时候直接调用即可,顺便提一下代码中怎么加入代理ip。import requests url = 'www.baidu.com' headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36", } proxies = { "http": "http://111.177.181.44:9999", # "https": "https://111.177.181.44:9999", } res = requests.get(url=url, headers=headers, proxies=proxies) 好了,这样就再也不用担心爬虫被封了。YYDS如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。
在不使用int()函数的情况下如何把字符串转换为数字,如把字符串"12345"转换为数字12345。利用str函数既然不能用int函数,那我们就反其道而行,用str函数找出每一位字符表示的数字大写。def atoi(s): s = s[::-1] num = 0 for i, v in enumerate(s): for j in range(0, 10): if v == str(j): num += j * (10 ** i) return num利用ord函数利用ord求出每一位字符的ASCII码再减去字符0的ASCII码求出每位表示的数字大写。def atoi(s): s = s[::-1] num = 0 for i, v in enumerate(s): offset = ord(v) - ord('0') num += offset * (10 ** i) return num利用eval函数eval的功能是将字符串str当成有效的表达式来求值并返回计算结果。我们利用这特点可以利用每位字符构造成和1相乘的表达式,再用eval算出该表达式的返回值就表示数字大写。def atoi(s): s = s[::-1] num = 0 for i, v in enumerate(s): t = '%s * 1' % v n = eval(t) num += n * (10 ** i) return num通过模块转换import string str='555' num=string.atoi(str) # num即为str转换成的数字 转换为浮点数:string.atof(str)
需求给定一个现有的 EXCEL 文件,使用包 openpyxl 执行以下每个任务的函数(使工作表变量成为输入参数): 给定带有值的起始单元格的行号和列号,返回起始单元格右侧(并包括)的连续非空单元格的数量,直到找到第一个空单元格。 给定一个带有值的起始单元格的行和列号,返回起始单元格下方(并包括)的连续非空单元格的数量,直到找到第一个空单元格。素材实战代码实现 from openpyxl import load_workbook def GetRowCount(sheet,StartRow,StartColumn): count = 0 Row = StartRow Column = StartColumn while True: cellValue = sheet.cell(row=Row,column=Column).value if cellValue == None : break count += 1 Column += 1 return count def GetColumnCount(sheet,StartRow,StartColumn): count = 0 Row = StartRow Column = StartColumn while True: cellValue = sheet.cell(row=Row,column=Column).value if cellValue == None : break count += 1 Row += 1 return count if __name__ == '__main__': wb = load_workbook('Test.xlsx') sheet = wb.active while True: inputLine = int(input("请输入起始 <行号>:")) inputColumn = int(input("请输入起始 <列号>:")) print('====查找行非空单元格数量============') rowCount=GetRowCount(sheet, inputLine, inputColumn) print(rowCount) print('====查找列非空单元格数量============') LineCount=GetColumnCount(sheet, inputLine, inputColumn) print(LineCount) 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。如果本文对你学习有所帮助-可以点赞+ 关注 !将持续更新更多新的文章。支持原创。感谢!
需求编写两个名为 IsEven1 和 IsEven2 的函数,如果给定的正整数是偶数,则返回值 1,否则返回 0,如下所示:IsEven1:仅使用一个赋值语句和 mod 运算符 %。IsEven2:仅使用一个赋值语句而不使用 mod 运算符 %。实战代码实现 def IsEven1(num): if (num>0) and ((num % 2)==0): return 1 else: return 0 def IsEven2(num): if (num>0) and ((num & 1)==0): return 1 else: return 0 def main(): n=int(input(" 请输入一个正整数:")) print() if IsEven1(n) == 1: print('函数IsEven1',1) else: print('函数IsEven1',0) print() if IsEven2(n) == 1: print('函数IsEven2',1) else: print('函数IsEven2',0) if __name__ == '__main__': main() 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。如果本文对你学习有所帮助-可以点赞+ 关注 + 打赏!将持续更新更多新的文章。支持原创。感谢!
需求一副扑克牌,分为四种花色,13 个面值。花色分别用字符串“C”、“D”、“H”、“S”表示,面值分别用整数 1、2、……、13 表示。 编写一个程序,通过输入得到五个卡片,按照其面值的升序排列。 在确保正确输入面值后,确定这些卡片是“顺子”还是“同花”(或两者兼有)。 “顺子”是指五个面值严格连续 “同花”是指所有五张牌都来自同一花色。(使用build-in功能)实战代码实现a = [0,0,0,0,0] t = '' th = 1 sz = 1 for i in range(5): a[i] = input('请输入第' + str(i) + '张卡片') for i in range(4): for j in range(i+1,5): if int(a[i][1]) >= int(a[j][1]): t = a[i] a[i] = a[j] a[j] = t for i in range(1,5): if int(a[i][1])!=int(a[i-1][1]) + 1 : sz = 0 if a[i][0] != a[i-1][0]: th = 0 if th == 1 and sz == 1: print('两者兼有') if th == 0 and sz == 1: print('顺子') if th == 1 and sz == 0: print('同花') 如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
展示数据实战# -*- encoding: utf-8 -*- import xlrd from pyecharts.charts import Bar from valud.until import dict_values, dicts, get_values, get_city_values # 创建表格 excels = xlrd.open_workbook('../valud/实验数据.xls') # 获取指定单元的sheet数据, 0代表第一个 sheets = excels.sheets()[0] city = ['湖南', '贵州', '深圳', '湖北', '重庆', '四川', '黑龙江', '香港', '北京'] # 实例分析对象 bar = Bar() # 添加x轴数据 bar.add_xaxis(city) value1, value2,value3,value4,value5 = dict_values() value1, value2,value3,value4,value5 = dicts(sheets, value1, value2, value3, value4, value5) # 添加y数据,注意与上述数据相对应 bar.add_yaxis("2015业绩", get_values(value1)) bar.add_yaxis("2016业绩", get_values(value2)) bar.add_yaxis("2017业绩", get_values(value3)) bar.add_yaxis("2018业绩", get_values(value4)) bar.add_yaxis("2019业绩", get_values(value5)) # 保存页面化文件 bar.render('柱状图.html') 结果展示如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
效果展示数据实战# -*- encoding: utf-8 -*- import xlrd import matplotlib.pyplot as plt from valud.until import dict_values, dicts, render_map_chart # 打开表格 excels = xlrd.open_workbook('../valud/实验数据.xls') # 获取指定单元的sheet数据, 0代表第一个 sheets = excels.sheets()[0] # 创建画布 plt.figure(figsize=(10, 5), dpi=100) colors = ['pink', 'r', 'g', 'y', 'c', 'm', 'lavender', 'b', 'c'] citys = ['湖南', '贵州', '深圳', '湖北', '重庆', '四川', '黑龙江', '香港', '北京'] value1, value2,value3,value4,value5 = dict_values() value1, value2,value3,value4,value5 = dicts(sheets, value1, value2, value3, value4, value5) render_map_chart(value1, value2, value3, value4, value5) 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。结果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战代码源文件import requests from lxml import etree import pandas as pd df = [] headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4343.0 Safari/537.36', 'Referer': 'https://movie.douban.com/top250'} columns = ['排名','电影名称','导演','上映年份','制作国家','类型','评分','评价分数','短评'] def get_data(html): xp = etree.HTML(html) lis = xp.xpath('//*[@id="content"]/div/div[1]/ol/li') for li in lis: """排名、标题、导演、演员、""" ranks = li.xpath('div/div[1]/em/text()') titles = li.xpath('div/div[2]/div[1]/a/span[1]/text()') directors = li.xpath('div/div[2]/div[2]/p[1]/text()')[0].strip().replace("\xa0\xa0\xa0","\t").split("\t") infos = li.xpath('div/div[2]/div[2]/p[1]/text()')[1].strip().replace('\xa0','').split('/') dates,areas,genres = infos[0],infos[1],infos[2] ratings = li.xpath('.//div[@class="star"]/span[2]/text()')[0] scores = li.xpath('.//div[@class="star"]/span[4]/text()')[0][:-3] quotes = li.xpath('.//p[@class="quote"]/span/text()') for rank,title,director in zip(ranks,titles,directors): if len(quotes) == 0: quotes = None else: quotes = quotes[0] df.append([rank,title,director,dates,areas,genres,ratings,scores,quotes]) d = pd.DataFrame(df,columns=columns) d.to_excel('Top250.xls',index=False) for i in range(0,251,25): url = "https://movie.douban.com/top250?start={}&filter=".format(str(i)) res = requests.get(url,headers=headers) html = res.text get_data(html) 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
数据实战1、读取表格数据import pandas data = pandas.ExcelFile('数字经济.xlsx') sheet_names = data.sheet_names print(sheet_names)2、读取某个单元格中数据for sheet in sheet_names: if sheet == '2020年指标': # 读取2020年指标 df = pandas.read_excel('数字经济.xlsx', sheet_name=sheet) print(df) 3、剔除不需要的数据 df = df.iloc[1:, :] # 修改表前2行的数据并将表头修改 df.columns = df.iloc[0:2, :].values[0] # 提取数据 print(df)4、选中某列数据进行提取sl_df = df["移动电话基站(万个)"] # 提取值 salary = df.values print(salary)5、继续处理数据,以满足数据分析的需求# 0 是城市 city = [city[0] for city in salary] print(city) # 1 是移动电话基站(万个) iphone_01 = [city[1] for city in salary] # 2 移动电话普及率(部/百人) iphone_02 = [city[2] for city in salary] print(iphone_02)6、数据分析可视化import matplotlib.pyplot as plt import matplotlib size = list() for font_size in iphone_02: size.append(font_size) if font_size > 100 else size.append(100) # 设置字体 font = {'family': 'simHei', 'weight': 'bold', 'size': '12'} matplotlib.rc('font', **font) plt.figure(figsize=(10, 10), dpi=80) plt.scatter(iphone_01, iphone_02, s=size,c='red') plt.xlabel("移动电话基站(万个)", fontdict={'size': 16}) plt.ylabel("移动电话普及率(部/百人)", fontdict={'size': 16}) plt.title("2020年指标", fontdict={'size': 20}) plt.savefig('手机基站数据分析.png',dpi=80) plt.show()散点图折线图如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
需求实战思路流程图绘制代码原理实现import time import queue import threading def worker(i): global numbers_1,numbers_2 numbers_1 = 0 numbers_2 = 0 while True: item = q.get() try: # 偶数 if (item % 2) == 0: # time.sleep(2) if (numbers_1 % 2)==0: print("小红医生(代号%s)将一个群众<%s>检测完了!" % (i, item)) # 做完后发出任务完成信号,然后继续下一个任务 q.task_done() else: time.sleep(2.5) q.task_done() numbers_1 += 1 else: # 奇数 # 小明是小红的2倍 print("小明医生(代号%s)将一个群众<%s>检测完了!" % (i, item)) numbers_2 += 1 # 做完后发出任务完成信号,然后继续下一个任务 q.task_done() except TypeError: print("今天没有群众需要检测了;医生(代号%s),可以休息了。" % i) if i==1: print('医生(代号%s)今天完成了的群众数量为:%s'% (i, numbers_1)) elif i==2: print('医生(代号%s)今天完成了的群众数量为:'% i, numbers_2) # 做完后发出任务完成信号,然后继续下一个任务 q.task_done() break if __name__ == '__main__': num_of_threads = 2 # 模拟核酸检测群众 source = [i for i in range(1, 30)] # 创建一个FIFO队列对象,不设置上限 q = queue.Queue() # 创建一个线程池 threads = [] # 创建指定个数的工作线程,并讲他们放到线程池threads中 for i in range(1, num_of_threads+1): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() # 将任务源里的任务逐个放入队列 for item in source: # 每隔0.5秒准备下一个要检测的群众 time.sleep(0.5) q.put(item) # 阻塞队列直到队列里的任务都完成了 q.join() print("-----统计小红医生、小明医生工作完成的情况-----") # 停止线程 for i in range(num_of_threads): q.put(None) for t in threads: t.join() 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
需求实战思路流程图绘制代码原理实现frog_step = int(input("请输入青蛙每次跳多少米:")) fox_step = int(input("请输入狐狸每次跳多少米:")) trap_step = int(input("请输入每隔多少米有大坑存在:")) x = 1 y = 1 while (x * frog_step) % trap_step != 0: x += 1 print('青蛙跳进坑里跳了%s次'%x) # 青蛙跳进坑里跳了几次 while (y * fox_step) % trap_step != 0: y += 1 print('狐狸跳进坑里跳了%s次'%y) # 狐狸跳进坑里跳了几次 if x == y: # 同时跳进坑里 print("both") elif x < y: # 青蛙 print("frog") elif x > y: # 狐狸 print("fox") 如果学习上有遇到问题,加/:yiyi990805(备注:阿里云tony)即可。在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战第一步:请求网络;获取到网站返回的数据内容 import requests cookies = { 'did': 'web_87ee5530f7dc26c5c05dfe66acf70e14', 'didv': '1649420428219', 'kpf': 'PC_WEB', 'kpn': 'KUAISHOU_VISION', 'clientid': '3', 'client_key': '65890b29', 'ksliveShowClipTip': 'true', 'userId': '16671983', 'kuaishou.server.web_st': 'ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABSRZDXsMuMvNx1jD8ZrUbZx_qeCKWWqkVg-4tSrPfgTQp7QUnDzCiXTRP0eZ63V7L7RxgN9b4nJYFUy_niJt7iUfU7T0IgFdNrcNxxSC20NNO1idShl4Ej_5Fb2HYtsb_RFEbRRpJg3GVQgkO_6tqANUEoUSyimIte_FRYGpZULgBp52oYcbiMvMv4WXnWIANARWMpAkRPwDvQphvtSLIZRoS5dGNQ2tN9j6L3QVO7fJXKiWdIiBrgZXAQs5LwU8-GCZrASiTRnFw2HQnkYMugbe7K5GyiigFMAE', 'kuaishou.server.web_ph': '1add9f8e5ac33f374cfd8dba6cde9f596395', } headers = { 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive','Origin': 'https://www.kuaishou.com', 'Referer': 'https://www.kuaishou.com/profile/3xjs47vsmgzxgnu', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'accept': '*/*', 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } # 携带的数据 json_data = { 'operationName': 'visionProfilePhotoList', 'variables': { 'userId': '3xjs47vsmgzxgnu', 'pcursor': '', 'page': 'profile', }, 'query': 'fragment photoContent on PhotoEntity {\n id\n duration\n caption\n likeCount\n viewCount\n realLikeCount\n coverUrl\n photoUrl\n photoH265Url\n manifest\n manifestH265\n videoResource\n coverUrls {\n url\n __typename\n }\n timestamp\n expTag\n animatedCoverUrl\n distance\n videoRatio\n liked\n stereoType\n profileUserTopPhoto\n __typename\n}\n\nfragment feedContent on Feed {\n type\n author {\n id\n name\n headerUrl\n following\n headerUrls {\n url\n __typename\n }\n __typename\n }\n photo {\n ...photoContent\n __typename\n }\n canAddComment\n llsid\n status\n currentPcursor\n __typename\n}\n\nquery visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n result\n llsid\n webPageArea\n feeds {\n ...feedContent\n __typename\n }\n hostName\n pcursor\n __typename\n }\n}\n', } response = requests.post('https://www.kuaishou.com/graphql', cookies=cookies, headers=headers, json=json_data) print(response.json()) 如果学习上有遇到问题,想联系我可以加v:yiyi990805(备注:阿里云tony)即可。第二步:对数据进行提取和解析for tony in response.json()['data']['visionProfilePhotoList']['feeds']: print(tony['photo'])接下来,大家按照这种方式进行数据的提取就可以了 ;视频的地址链接就在该数据中。如果大家不会保存,可以看我前面写的爬虫系列文章,都有讲解如何保存视频文件的。实践才是检验真理的唯一标准。效果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战第一步:请求网络链接先获取到网站返回数据 import requests from lxml import etree cookies = { '_ntes_nnid': 'aa83197e2faf6f06a6599baf24b3418f,1636546158090', 'NMTID': '00O_4a1Ksfjt8lY1UEkriEl1Ik5yAEAAAF-i9Ao1Q', 'WNMCID': 'uhexut.1643026186736.01.0', 'WEVNSM': '1.0.0', 'WM_TID': '8cq4tB6m0mBBFVUREVdvjxZEswHWwVXc', '_ntes_nuid': 'aa83197e2faf6f06a6599baf24b3418f', '_iuqxldmzr_': '32', 'ntes_kaola_ad': '1', 'JSESSIONID-WYYY': 'I2U9%5CTv%5Cog%5CXZ%5CgroWkmFHoowf8pMgXEqf13F3F5fEDAGWMlAMq50jqRADXvvCsdRshDN6T%5CaGVWEIMZXxbIMXiK5NwlW5E3dmWqujPacyXYUtbat1O9j8RV8vK%2F2QP93Av3YX3nenYXhcyu8DG8BgZapJRG5nj5o2qQDZw%5CVnVWJak4%3A1658580273713', 'WM_NI': 'mZ3qnftT0NW1rAaRMxmMbpsOdDTMMvyvUX87SciskowqIITK2VyGzPos0kF0EEHeHhcqn4xED0Rteh6xE%2Fk%2Bn3xVdxBWmU4e3K22W1ZrHmuKXdeasKUzmRwfSC5JpMbNSjY%3D', 'WM_NIKE': '9ca17ae2e6ffcda170e2e6ee99c87ea2bea7b2c96b838e8bb6d85f829b9e83c54987b796d0b7799888e188cc2af0fea7c3b92aaf86fd92ed6eb88c00afd63bb29fafb3d074af93ae91f245a89c9caed07ebbaa9bb9bb3d91bda794ea65b5af87aad741f28ab7a8f95cadad008cc53c879b8886cb64a1afa2d5fb4f88f09e95e864f6a88bd0ea21aeedb8b7e7748289a3b6b76ff195fed3d63b9aae888ef8419cbcab82f24197a6a3b3f66e919dfbabf347a2929d8bdc37e2a3', } headers = { 'authority': 'music.163.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language': 'zh-CN,zh;q=0.9','referer': 'https://music.163.com/', 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'iframe', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', } params = { 'id': '4980157066', } response = requests.get('https://music.163.com/playlist', params=params, cookies=cookies, headers=headers) print(response.text) 第二步:通过xpath进行数据解析加载的数据 = etree.HTML(response.text) 提取的数据 = 加载的数据.xpath('//ul[@class="f-hide"]/li/a/@href') print(提取的数据) 如果学习上有遇到问题,想联系我可以加v:yiyi990805(备注:阿里云tony)即可。第三步:持久化 保存数据替换 = tony.replace('/song?id=','') 网址MP3 = f'https://link.hhtjim.com/163/{替换}.mp3' print(网址MP3) mp3 = requests.get(网址MP3, params=params, cookies=cookies, headers=headers) # 打开某个文件 file = open('Tony老师的音乐.mp3','wb') file.write(mp3.content) 结果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战分析网页结构,找到需要抓取的数据通过键盘上的F12,进入抓包工具;选择network。找到网址链接,复制,这里我通过工具生成了,爬虫的第一步。第一步:请求网页,获取数据import requests cookies = { 'ipLoc-djd': '18-1482-0-0', '__jda': '122270672.16518397672031804136707.1651839767.1651839767.1651839767.1', 'qrsc': '1', 'rkv': '1.0', 'areaId': '18', } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'Cache-Control': 'max-age=0', } params = { 'keyword': '电脑', } # 1、 请求网络 - 得到网站返回的数据 response = requests.get('https://search.jd.com/Search', params=params, cookies=cookies, headers=headers) # 打印 富文本 print(response.text)第二步:提取商品数据from bs4 import BeautifulSoup soup = BeautifulSoup(response.text,'html.parser') # 循环嵌套 for div in soup.find_all('div',class_="ml-wrap"): print(div) for div2 in soup.find_all('div',class_="goods-list-v2 gl-type-1 J-goods-list"): for price in soup.find_all('div',class_="p-name p-name-type-2"): for prices in soup.find_all('em'): print(prices.text)第三步: 持久化保存数据这里使用了简单的txt文件保存file = open('京东.txt','a',encoding='utf-8') file.write(prices.text+'\n')如果学习上有遇到问题,想联系我可以加v:yiyi990805(备注:阿里云tony)即可。如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
第一步:获取图像或者pdf文件的大小from PIL import Image image_file = input("请输入图片地址:") img = Image.open(image_file) width, height = img.size print(width,height)第二步:获取图片本身每一处的像素值for pos in product(range(width), range(height)): rgb = img.getpixel(pos)[:3] print(rgb)第三步:通过不同的像素值 对其进行替换 if sum(rgb) >= 384: # print('(128,128,128)找到了--->',rgb) img.putpixel(pos, (255, 255, 255)) img.save('水印Demo/tony2.png')结果展示源文件处理后的文件如果学习上有遇到问题,想联系我可以加v:yiyi990805(备注:阿里云tony)即可。问题思考既然图片经过处理后可以很清晰,那如果处理在处理pdf文件时讲pdf文件转化为png图片格式,再处理图片,然后再合成为pdf;是否可行呢 ? 大家可以自行尝试一下。 当然我已经尝试成功了,可以做到很清晰。( ̄︶ ̄)如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
实战思路:1| 搭建界面 (输入框 + 按钮 + 提示标签)2| 业务层 - 自动化爬虫 - 无界面浏览器3| 保存 - 持久化 -4| 打包成PC端exe运行程序安装模块: pip install selenium目标网站,不允许复制任何数据,需要VIP充钱才行,今天我们就破解这个。第一步| 搭建界面 (输入框 + 按钮 + 提示标签)from tkinter import * tk = Tk() tk.title('自动化破解工具') tk.geometry('+900+300') tk.mainloop()# 网格布局框架 f1 = Frame(tk) f1.pack(padx=20,pady=15) Label(f1,text='请输入要破解的文章链接:').grid(row= 0,column = 0) # 字符串 str in_tony = StringVar() # 输入框 Entry(f1,width=50,textvariable=in_tony).grid(row= 0,column = 1) # 按钮 Button(tk,text=' 开始破解 ',command = data).pack() 第二步| 业务层 - 自动化爬虫 - 无界面浏览器 from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions # 单独的 代码区域 - def data(): # 获取输入框中的网址 url = in_tony.get() # 加载驱动 options = ChromeOptions() # 隐藏浏览器 - options.add_argument('--headless') driver = Chrome('chromedriver.exe', options=options) # 打开一个网页 driver.get(url) text = driver.find_elements_by_xpath('//div[@class="content"]') # 循环 for tony in text: print(tony.text)第三步| 保存 - 持久化 -file = open('文章.doc', 'w') file.write(tony.text + '\n')第四步| 打包成PC端exe运行程序打包可以通过pyinstaller进行打包 。指令输入在cmd 命令行中。打包指令;使用绝对路径。pyinstaller -F xxxxx.py在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战# -*- coding: utf-8 -*- # @Author : Tony import exrex # 生成字典密码 def make_pass(pwds): # 保存生成的字典 fout = open('password_out.txt', 'w') fout.close() # 假设包含三种内容 1.字符串 2.数字密码 3.下划线或井号 for pwd in pwds: # 生成三种组合(含大小写) rules = ['({pwd})([az][Xx][Zz])(_|#)', '([Tz][Xx][Zz])({pwd})(_|#)', '(_|#)({pwd})([Tz][Xx][Zz])'] # 密码生成 for rule in rules: final_pwds = list(exrex.generate(rule.format(pwd=pwd))) for final_pwd in final_pwds: print(final_pwd) # 保存生成的字典 fout = open('password_out.txt', 'a+') fout.write(final_pwd + '\n') fout.close() # 主函数 if __name__ == '__main__': # 常见密码 弱口令 -- 过滤 pwds = ['123456', '111111', '666666', '12345678', 'qwerty', '123456789', 'abc123'] make_pass(pwds)
实战快手的官网中有很多不同种类的栏目,如果想抓取该网站的视频数据,就需要先确定要抓取的视频种类。比如直播数据,当然直播的数据肯定是抓取不了的,因为还没有生成mp4文件。进入主播的直播间,我们可以看到主播发布的作品,这些作品都是可以批量抓取的。分析网页的时候,可以通过搜索关键词mp4文件。找到之后就可以请求并下载数据了;大家可以自行摸索一下。我前面的文章都有讲如何分析。《键盘上按F12就可以进入到抓包工具界面》。第一步:请求网页数据;这里我采用进度条形式的下载方式 from tqdm import tqdm import time for tony in tqdm(range(100)): time.sleep(0.5)第二步:获取网页视频长度import requests url = 'https://txmov2.a.kwimgs.com/bs2/newWatermark/Nzc1MTI4NjU4ODE_zh_4.mp4' # 发起网络请求 Content-Length: 5817208 长度 res = requests.get(url) size = int(res.headers['Content-Length']) print(size)第三步:对视频长度进行处理及保存 file_name = 'tony老师下载的王者荣耀视频.mp4' # bytes 字节 with open(file_name,'wb') as file: # 100%|██████████| 100/100 [01:40<00:00, 1.01s/it] kb for tony in tqdm( # 视频文件读取 res.iter_content(size), total=size, desc=file_name, unit='kb' # tony老师下载的王者荣耀视频.mp4: 27460kb [00:00, 372074.26kb/s] ): # 15%|█▍ | 14/100 [00:14<01:26, 1.01s/it] file.write(tony) 结果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战安装模块: pip install turtle爱心表白树脚本,直接运行就可以。后面有展示的效果,记得点赞+ 关注呀!感谢!import turtle import random def love(x,y): lv=turtle.Turtle() lv.hideturtle() lv.up() lv.goto(x,y)#定位到(x,y) def curvemove():#画圆弧 for i in range(20): lv.right(10) lv.forward(2) lv.color('red','pink') lv.speed(10000000) lv.pensize(1) #开始画爱心lalala lv.down() lv.begin_fill() lv.left(140) lv.forward(22) curvemove() lv.left(120) curvemove() lv.forward(22) lv.write("❥",font=("Arial",12,"normal"),align="center")#写上表白的人的名字 lv.left(140)#画完复位 lv.end_fill() def tree(branchLen,t): if branchLen > 5:#剩余树枝太少要结束递归 if branchLen<20: t.color("green") t.pensize(random.uniform((branchLen + 5) / 4 - 2, (branchLen + 6) / 4 + 5)) t.down() t.forward(branchLen) love(t.xcor(),t.ycor())#传输现在turtle的坐标 t.up() t.backward(branchLen) t.color("brown") return t.pensize(random.uniform((branchLen+5)/4-2,(branchLen+6)/4+5)) t.down() t.forward(branchLen) # 以下递归 ang=random.uniform(15,45) t.right(ang) tree(branchLen-random.uniform(12,16),t)#随机决定减小长度 t.left(2*ang) tree(branchLen-random.uniform(12,16),t)#随机决定减小长度 t.right(ang) t.up() t.backward(branchLen) myWin = turtle.Screen() t = turtle.Turtle() t.hideturtle() t.speed(1000) t.left(90) t.up() t.backward(200) t.down() t.color("brown") t.pensize(32) t.forward(60) tree(100,t) myWin.exitonclick() 效果展示如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
实战安装模块: pip install turtle送给大家的福利,程序直接运行就好。后面有展示的效果,记得点赞+ 关注呀!感谢!from turtle import * import time def setTurtle(): # 窗口大小 screensize(900, 700, 'pink') # 颜色 color('red', 'pink') # 笔粗细 pensize(3) # 速度 speed(6) # 提笔 penup() def getStart(h): # 去到的坐标,窗口中心为0,0 goto(0, -180) r = h / 5 drawBigL(r, h) drawBigArc(r, 140) drawBigArc(r, 70) drawBigR(r, h) centerRange() drawHope() drawName() def drawBigL(r, h): colors = ['red', 'orange', 'yellow', '#87CEEB', 'violet', 'red'] for i in range(int(240 / h) + 1): seth(0) color(colors[i], colors[i + 1]) drawHeart(r) seth(140) fd(h) def drawBigArc(r, rad): colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red'] for i in range(50): if (i % 10 == 0): color(colors[int(i / 10)], colors[int(i / 10) + 1]) seth(0) drawHeart(r) seth(rad - (i + 1) * 4) rt(4) fd(10.5) def drawBigR(r, h): colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red'] for i in range(int(240 / h) + 1): color(colors[i], colors[i + 1]) seth(0) drawHeart(r) setheading(220) fd(h) def drawHeart(r): down() begin_fill() factor = 180 seth(45) circle(-r, factor) fd(2 * r) right(90) fd(2 * r) circle(-r, factor) end_fill() up() # 在心中写字 def centerRange(): for i in range(6): drawCenter(i) time.sleep(1) def drawCenter(i): goto(0, 0) colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red'] pencolor(colors[i]) # 在心中写字 font可以设置字体自己电脑有的都可以设 align开始写字的位置 #write('love ...', font=('gungsuh', 30,), align="center") up() # 写寄语 def drawHope(): pencolor('black') goto(-300, -220) showturtle() write('晚上的鞭炮再响,', font=('华文行楷', 25,), align="center", move=True) goto(-300, -270) write('也没有我想你那么想。', font=('华文行楷', 25,), align="center", move=True) # 写署名 def drawName(): pencolor('black') goto(250, -250) showturtle() write('520 节日快乐!老师就帮你到这了!', font=('gungsuh', 20,), align="center", move=True) setTurtle() getStart(80) # 点击窗口关闭 window = Screen() window.exitonclick() 效果展示如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
实战安装模块 pip install openpyxl第一步:创建表格及工作表from openpyxl import Workbook # 创建一个表格 wb = Workbook() # 创建工作表 one = wb.create_sheet('娃哈哈') two = wb.create_sheet('旺仔') wb.create_sheet('牛奶') three = wb.create_sheet('Tony老师') wb.create_sheet('在上课') # 保存 wb.save('西游记.xlsx')第二步:添加表格数据# 添加一个值 单元格 one.cell(row=15,column=1,value='老师') # one['G23'] = 123 one['a2'] = 2343 one['C3'] = 'hahaha' a = [11,2,3,4,5,6,7,8,'猴子','妲己'] # 多行添加 two.append(a) # 多行 多列添加 data = [ ['入职时间','公司人力成本总额','在岗人数','人均成本'], [2015,10000,1000,9.6], [2016,12000,1100,19.6], [2017,15000,1500,29.6], [2018,9000,800,39.6], [2019,11000,900,9.6], [2020,30000,2000,16.6], [2021,20000,1700,10.1], ] for tony in data: three.append(tony) 第三步:数据可视化分析from openpyxl.chart import PieChart,Reference,BarChart # 数据分析 - 饼状图 pie = PieChart() pie.title='Tony老师来到此一游' # 设置数据对比 展示 图标 label = Reference(three,min_col=1,min_row=2,max_row=8) data = Reference(three,min_col=2,min_row=2,max_row=8) pie.add_data(data) pie.set_categories(label) # 添加 three.add_chart(pie,'b10') # 数据分析 - 柱状图 bar = BarChart() bar.title='Tony老师来到此一游' bar.x_axis.title= '年份' bar.type = 'bar' bar.style = 15 # 设置数据对比 展示 图标 labels = Reference(three,min_col=1,min_row=2,max_row=8) datas = Reference(three,min_col=2,min_row=2,max_row=8) bar.add_data(datas) bar.set_categories(labels) # 添加 three.add_chart(bar,'j2')效果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战今日的目标网站第一步:目标 - 网址 - 分析 - 发起网络请求 - 得到网站数据import requests cookies = { 'SINAGLOBAL': '4164568015392.127.1641551947467', 'SUBP': '0033WrSXqPxfM725Ws9jqgMF55529P9D9Wh2oFXSR-ZhVoD7mP8mQX5S5JpX5KMhUgL.Fo-71hqRSoMNSo-2dJLoIpYLxK-L1hqLBoMLxKnL1h.LBoeLxKML1-2L1hxJ9J9J', 'UPSTREAM-SERVICE-ACCOUNT-WEIBO-COM': '5c9d4090953640c68ef0a73f01c3673b', 'ALF': '1687088338', 'SSOLoginState': '1655552337', 'SCF': 'AmHV4ft38uoBMvGWUwHit4snm_fp21qN-LbyZIeqTtam1IRnq0gVDmexwVlu9Ce1cRXqyK7uMpELU4G6Do_3q08.', 'SUB': '_2A25PqckDDeRhGeNO41QZ9inLzTmIHXVs3r3LrDV8PUNbmtANLWzBkW9NTt9Ar3W6_endjwecllkTKZB6gQhHxF8N', '_s_tentry': 'login.sina.com.cn', 'UOR': ',,login.sina.com.cn', 'Apache': '3914150919076.753.1655552339605', 'ULV': '1655552339610:8:3:3:3914150919076.753.1655552339605:1655476178593', 'PC_TOKEN': '49701743a5', 'WBStorage': '4d96c54e|undefined', } headers = { 'authority': 'service.account.weibo.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'max-age=0','referer': 'https://service.account.weibo.com/?type=6&status=0', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36', } params = { 'type': '5', 'status': '0', } # 请求网络 response = requests.get('https://service.account.weibo.com/', params=params, cookies=cookies, headers=headers) print(response.text)我们发现获取到的数据,非常的混乱,并且里面也没有显示任何的中文,不好辩解,比如网址的链接等。需要特殊的处理一下。# 转码 response = response.content.decode('unicode_escape') print(response)经过处理之后,数据结构一目了然。接下来把我们认为中要的数据进行提取就可以了。这里我采用的是re正则表达式,其他的方式也可以 大家可以自行探索一番。第二步:解析 - 提 取有价值的数据内容点击每一个标题,会进入到该消息的详情页中。import re re_content = re.findall('<td><div class="m_table_tit"><a href="(.*?)" target="_blank">.*?</a></div></td>',response) print(re_content)for tony in re_content: # + 拼接 链接 url = 'https://service.account.weibo.com' + tony print(url)接下来重复第一步、第二步的操作,获取到详情页的数据;其他的数据以此类推,都是一样的思路;大家可以动手自己实践下。第三步: 持久化保存数据 for text in content: file = open('tony-微博.txt','a',encoding='utf-8') file.write(text+'\n')在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
实战素材准备:安装第三方模块:pip install PyQt5效果先展示一下本项目共分为3个模块 分别是 窗口组件功能代码、窗口组件代码、程序运行代码。第一步:窗口组件功能代码from PyQt5.QtWidgets import QWidget from PyQt5.Qt import QPixmap, QPainter, QPoint, QPaintEvent, QMouseEvent, QPen, \ QColor, QSize from PyQt5.QtCore import Qt class PaintBoard(QWidget): def __init__(self, Parent=None): ''' Constructor ''' super().__init__(Parent) self.__InitData() # 先初始化数据,再初始化界面 self.__InitView() def __InitData(self): self.__size = QSize(480, 460) # 新建QPixmap作为画板,尺寸为__size self.__board = QPixmap(self.__size) self.__board.fill(Qt.white) # 用白色填充画板 self.__IsEmpty = True # 默认为空画板 self.EraserMode = False # 默认为禁用橡皮擦模式 self.__lastPos = QPoint(0, 0) # 上一次鼠标位置 self.__currentPos = QPoint(0, 0) # 当前的鼠标位置 self.__painter = QPainter() # 新建绘图工具 self.__thickness = 10 # 默认画笔粗细为10px self.__penColor = QColor("black") # 设置默认画笔颜色为黑色 self.__colorList = QColor.colorNames() # 获取颜色列表 def __InitView(self): # 设置界面的尺寸为__size self.setFixedSize(self.__size) def Clear(self): # 清空画板 self.__board.fill(Qt.white) self.update() self.__IsEmpty = True def ChangePenColor(self, color="black"): # 改变画笔颜色 self.__penColor = QColor(color) def ChangePenThickness(self, thickness=10): # 改变画笔粗细 self.__thickness = thickness def IsEmpty(self): # 返回画板是否为空 return self.__IsEmpty def GetContentAsQImage(self): # 获取画板内容(返回QImage) image = self.__board.toImage() return image def paintEvent(self, paintEvent): # 绘图事件 self.__painter.begin(self) # 0,0为绘图的左上角起点的坐标 self.__painter.drawPixmap(0, 0, self.__board) self.__painter.end() def mousePressEvent(self, mouseEvent): # 鼠标按下时,获取鼠标的当前位置保存为上一次位置 self.__currentPos = mouseEvent.pos() self.__lastPos = self.__currentPos def mouseMoveEvent(self, mouseEvent): # 鼠标移动时,更新当前位置,并在上一个位置和当前位置间画线 self.__currentPos = mouseEvent.pos() self.__painter.begin(self.__board) if self.EraserMode == False: # 非橡皮擦模式 self.__painter.setPen(QPen(self.__penColor, self.__thickness)) # 设置画笔颜色,粗细 else: # 橡皮擦模式下画笔为纯白色,粗细为10 self.__painter.setPen(QPen(Qt.white, 10)) # 画线 self.__painter.drawLine(self.__lastPos, self.__currentPos) self.__painter.end() self.__lastPos = self.__currentPos self.update() # 更新显示 def mouseReleaseEvent(self, mouseEvent): self.__IsEmpty = False # 画板不再为空第二步:窗口组件代码# -*- coding: utf-8 -*- # @Author : Tony from PyQt5.Qt import QWidget, QColor, QPixmap, QIcon, QSize, QCheckBox from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QPushButton, QSplitter, \ QComboBox, QLabel, QSpinBox, QFileDialog from *.PaintBoard import PaintBoard class MainWidget(QWidget): def __init__(self, Parent=None): ''' Constructor ''' super().__init__(Parent) self.__InitData() # 先初始化数据,再初始化界面 self.__InitView() def __InitData(self): ''' 初始化成员变量 ''' self.__paintBoard = PaintBoard(self) # 获取颜色列表(字符串类型) self.__colorList = QColor.colorNames() def __InitView(self): ''' 初始化界面 ''' self.setFixedSize(640, 480) self.setWindowTitle("PM_Tony老师定制的小画板·") # 新建一个水平布局作为本窗体的主布局 main_layout = QHBoxLayout(self) # 设置主布局内边距以及控件间距为10px main_layout.setSpacing(10) # 在主界面左侧放置画板 main_layout.addWidget(self.__paintBoard) # 新建垂直子布局用于放置按键 sub_layout = QVBoxLayout() # 设置此子布局和内部控件的间距为10px sub_layout.setContentsMargins(10, 10, 10, 10) self.__btn_Clear = QPushButton("清空画板") self.__btn_Clear.setParent(self) # 设置父对象为本界面 # 将按键按下信号与画板清空函数相关联 self.__btn_Clear.clicked.connect(self.__paintBoard.Clear) sub_layout.addWidget(self.__btn_Clear) self.__btn_Quit = QPushButton("退出") self.__btn_Quit.setParent(self) # 设置父对象为本界面 self.__btn_Quit.clicked.connect(self.Quit) sub_layout.addWidget(self.__btn_Quit) self.__btn_Save = QPushButton("保存作品") self.__btn_Save.setParent(self) self.__btn_Save.clicked.connect(self.on_btn_Save_Clicked) sub_layout.addWidget(self.__btn_Save) self.__cbtn_Eraser = QCheckBox(" 使用橡皮擦") self.__cbtn_Eraser.setParent(self) self.__cbtn_Eraser.clicked.connect(self.on_cbtn_Eraser_clicked) sub_layout.addWidget(self.__cbtn_Eraser) splitter = QSplitter(self) # 占位符 sub_layout.addWidget(splitter) self.__label_penThickness = QLabel(self) self.__label_penThickness.setText("画笔粗细") self.__label_penThickness.setFixedHeight(20) sub_layout.addWidget(self.__label_penThickness) self.__spinBox_penThickness = QSpinBox(self) self.__spinBox_penThickness.setMaximum(20) self.__spinBox_penThickness.setMinimum(2) self.__spinBox_penThickness.setValue(10) # 默认粗细为10 self.__spinBox_penThickness.setSingleStep(2) # 最小变化值为2 self.__spinBox_penThickness.valueChanged.connect( self.on_PenThicknessChange) # 关联spinBox值变化信号和函数on_PenThicknessChange sub_layout.addWidget(self.__spinBox_penThickness) self.__label_penColor = QLabel(self) self.__label_penColor.setText("画笔颜色") self.__label_penColor.setFixedHeight(20) sub_layout.addWidget(self.__label_penColor) self.__comboBox_penColor = QComboBox(self) self.__fillColorList(self.__comboBox_penColor) # 用各种颜色填充下拉列表 self.__comboBox_penColor.currentIndexChanged.connect(self.on_PenColorChange) # 关联下拉列表的当前索引变更信号与函数on_PenColorChange sub_layout.addWidget(self.__comboBox_penColor) main_layout.addLayout(sub_layout) # 将子布局加入主布局 def __fillColorList(self, comboBox): index_black = 0 index = 0 for color in self.__colorList: if color == "black": index_black = index index += 1 pix = QPixmap(70, 20) pix.fill(QColor(color)) comboBox.addItem(QIcon(pix), None) comboBox.setIconSize(QSize(70, 20)) comboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents) comboBox.setCurrentIndex(index_black) def on_PenColorChange(self): color_index = self.__comboBox_penColor.currentIndex() color_str = self.__colorList[color_index] self.__paintBoard.ChangePenColor(color_str) def on_PenThicknessChange(self): penThickness = self.__spinBox_penThickness.value() self.__paintBoard.ChangePenThickness(penThickness) def on_btn_Save_Clicked(self): savePath = QFileDialog.getSaveFileName(self, 'Save Your Paint', '.\\', '*.png') print(savePath) if savePath[0] == "": print("Save cancel") return image = self.__paintBoard.GetContentAsQImage() image.save(savePath[0]) def on_cbtn_Eraser_clicked(self): if self.__cbtn_Eraser.isChecked(): self.__paintBoard.EraserMode = True # 进入橡皮擦模式 else: self.__paintBoard.EraserMode = False # 退出橡皮擦模式 def Quit(self): self.close() 第三步:程序运行代码from *.MainWidget import MainWidget from PyQt5.QtWidgets import QApplication import sys if __name__ == '__main__': app = QApplication(sys.argv) # 创建窗口 mainWidget = MainWidget() # 显示 mainWidget.show() app.exit(app.exec_())效果展示如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
开始之前,捋一下思路:1、需要一个方形界面,这里选用pygame模块,搭建游戏窗口 2、窗口需要设置一张背景图片作为展示,可以添加个BGM音乐。3、可以设置一个灰色的背景图层把图片覆盖起来,起到一个可以刮的效果。准备素材:1、安装模块;指令:pip install pygame 2、一首mp3歌曲 3、1张或者多张图片第一步:搭建游戏窗口import sys import pygame # 初始化 预加载 pygame.init() # 窗口的大小 pygame.display.set_mode((800,500)) while True: # 获得 当前的事件 列表 events = pygame.event.get() # for events in events: if events.type == pygame.QUIT: # 退出当前的窗口界面 pygame.quit() sys.exit() pygame.display.update()第二步:设置游戏背景音乐# 加载音乐 pygame.mixer.music.load(r'500miles.mp3') # 播放音乐 pygame.mixer.music.play()第三步:随机窗口背景图片展示file_name = os.listdir('pic') print(file_name) print(random.choice(file_name)) # 拼接 image_path = os.path.join('pic',random.choice(file_name)) image_used = pygame.transform.scale(pygame.image.load(image_path), (800,500)) image_used = screen.blit(image_used, (0, 0))第四步:添加背景图层从上往下堆代码的话,总感觉不太好 ,接下来我会把前面的代码重新 通过函数封装一下。作为一名程序员代码逼格得上去不是。import os import sys import random import pygame # 定义常量 BGMPATH = 'music/500miles.mp3' IMAGEDIR = 'pictures' SUPPORTEXTS = ['jpg', 'png'] SCREENSIZE = (800, 600) WHITE = (255, 255, 255, 27) GRAY = (192, 192, 192) # 随机读取一张图片 def readImage(): file_names = os.listdir(IMAGEDIR) file_names = [f for f in file_names if f.split('.')[-1] in SUPPORTEXTS] img_path = os.path.join(IMAGEDIR, random.choice(file_names)) return pygame.transform.scale(pygame.image.load(img_path), SCREENSIZE) def main(): pygame.init() pygame.mixer.init() pygame.mixer.music.load(BGMPATH) pygame.mixer.music.play(-1, 0.0) pygame.mouse.set_cursor(*pygame.cursors.diamond) screen = pygame.display.set_mode(SCREENSIZE) pygame.display.set_caption('普门教育Tony老师-定制-纸质版-刮刮卡游戏') surface = pygame.Surface(SCREENSIZE).convert_alpha() surface.fill(GRAY) image_used = readImage() while True: # 这里要 添加获得 当前的事件 列表 mouse_event_flags = pygame.mouse.get_pressed() if mouse_event_flags[0]: pygame.draw.circle(surface, WHITE, pygame.mouse.get_pos(), 40) elif mouse_event_flags[-1]: surface.fill(GRAY) image_used = readImage() screen.blit(image_used, (0, 0)) screen.blit(surface, (0, 0)) pygame.display.update() if __name__ == '__main__': main() 这里的图片我设置了8张,可随机更换。第五步:效果展示在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
设计思路:1、实现微信九宫格图像,一张完整的图需要裁减成9个小方块;小方块需要是正方形2、切割小图片的时候 需要计算每张小图的尺寸,使其保持一致3、计算每张小图片的四个角的坐标;通过坐标实现图片的切割安装模块pip install pillow效果展示第一步 :填充图像 先将image填充为正方形from PIL import Image # 第一步 :填充图像 先将image填充为正方形 def fill_image(img): width, height = img.size new_image_length = width if width > height else height # mode: 模式,通常用"RGB"这种模式 # size:生成的图像大小 # color:生成图像的颜色,默认为0,即黑色 new_image = Image.new(img.mode, (new_image_length, new_image_length), color='white') # 判断如果原图的宽大于高,则填充图片的竖直维度 if width > height: new_image.paste(img, (0, int((new_image_length - height) / 2))) else: new_image.paste(img, (int((new_image_length - width) / 2), 0)) # 返回 return new_image if __name__ == '__main__': image = Image.open('./江疏影.png') fill_image(image)第二步 : 裁剪及分割图像# 第二步 : 裁剪、分割图像 def split_image(img): width, height = img.size item_width = int(width / 3) box_list = [] # (left, top, right, bottom) 设置图像四元组坐标 (左,上,右,下) # 内循环 - 外循环 - 3 * 3 = 9 for i in range(0, 3): for j in range(0, 3): # 设置图像四元组坐标 (左,上,右,下) box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width) box_list.append(box) """ 裁剪矩形,返回该图像的矩形区域 """ img_list = [img.crop(box) for box in box_list] return img_list if __name__ == '__main__': image = Image.open('./江疏影.png') image = fill_image(image) split_image(image)第三步 :保存图像# 第三步 :保存图像 def save_images(img_list): index = 1 for img in img_list: # img.save("./九宫格图片/"+str(index) + '.png', 'PNG') img.save("./九宫格图片/" + str(index) + '.png') index += 1 if __name__ == '__main__': save_images(image_list)最终效果展示如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
-实战设计思路:1、需要一个界面,这里选择了使用 tkinter2、需要一个画布用于填充界面的颜色,并且界面窗口需要设置一定的透明度3、根据每个电脑界面分辨率的不同, 需要获取到整个界面的像素点4、界面中需要绘制一些图形用于展示及图形需要在窗口界面中不断的移动5、如何设计程序退出;这里通过绑定用户的某个事件能够使程序顺利的退出最终的效果演示小球是来回运动的,碰到屏幕边缘 就会回弹。from random import randint from tkinter import * # 自定义 随机球 class RandBall: # 宽度 和 高度 def __init__(self, canvas, scrnwidth, scrnheight): # 初始化画布 self.canvas = canvas # 初始化球的圆心坐标 self.x_pos = randint(50, int(scrnwidth)) # X轴的坐标 randint 随机产生一个范围内的整数 self.y_pos = randint(50, int(scrnheight)) # Y轴的坐标 # 球的移动距离 self.scrnheight = scrnheight # 初始化球的半径 self.radius = randint(10, 80) # 随机产生球的颜色 rgb_color = lambda: randint(0, 255) # #703a5d #f66865 #aad740 self.color = '#%02x%02x%02x' % (rgb_color(), rgb_color(), rgb_color()) # print(self.color) def create_ball(self): # 计算得到 用于创建球的四个坐标 # x_pos :x轴圆心坐标 y_pos :y轴圆心坐标 # 球的半径 x1 = self.x_pos - self.radius y1 = self.y_pos - self.radius # 球的直径 x2 = self.x_pos + self.radius y2 = self.y_pos + self.radius # 画球 内填充颜色 边框颜色 self.oval = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color) def move_ball(self): # 球按照指定距离移动,如果碰到障碍就向相反的方向运动 # x_move:球x轴和y轴的移动距离 self.x_pos += self.x_move self.y_pos += self.y_move # 判断如果球的圆心坐标>= 屏幕宽度 - 球的半径 if self.x_pos >= self.scrnwidth - self.radius: # 球就向相反的方向运动 self.x_move = -self.x_move elif self.y_pos >= self.scrnheight - self.radius: self.y_move = -self.y_move elif self.x_pos < self.radius: self.x_move = abs(self.x_move) elif self.y_pos < self.radius: self.y_move = abs(self.y_move) self.canvas.move(self.oval, self.x_move, self.y_move) # 屏幕保护程序,视屏闲置画面 class ScreenSaver: balls = [] # 传递的小球数量 def __init__(self, ball_nums): # 创建窗口 self.win = Tk() # 屏幕的分辨率是非常容易获取到的,直接通过root.winfo_screenwidth()、root.winfo_screenheight() self.width = self.win.winfo_screenwidth() self.height = self.win.winfo_screenheight() # 如果参数为True,该窗口忽略所有的小部件( self.win.overrideredirect(True) # 0.7窗口透明度30% , 0.4窗口透明度60% , 0.5窗口透明度50% self.win.attributes('-alpha', 0.3) # 绑定事件,有任何动作退出屏保 self.win.bind('<Any-Button>', self.exit_screensaver) # Motion事件表示当鼠标进入组件时,就会响应这个事件 # 当鼠标在组件内移动的时候触发该事件 self.win.bind('<Motion>', self.exit_screensaver) # 初始化画布 并设置宽高 及背景颜色 self.canvas = Canvas(self.win, width=self.width, height=self.height, bg="#00FFFF") # 背景 颜色自己随便调整,至于啥颜色就看自己的心情了 self.canvas.pack() # 循环遍历 屏保小球个数 for i in range(0, ball_nums): # 调用小球类 ball = RandBall(self.canvas, scrnwidth=self.width, scrnheight=self.height) # 调用方法创建球 ball.create_ball() # 添加 self.balls.append(ball) # 运行 self.run_screensaver() self.win.mainloop() def run_screensaver(self): # 遍历 小球类对象 for ball in self.balls: # 调用小球类 移动方法 ball.move_ball() # 画布 self.canvas.after(30, self.run_screensaver) def exit_screensaver(self, event): # 销毁 self.win.destroy() if __name__ == '__main__': ScreenSaver(30) # 球的个数 演示如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。
效果演示图像的背景颜色是可以自行调节成随机颜色的,这里只演示一下。大家可在后面进行学习。安装模块:pip install pillowPIL是python2中提供的一个图像数据处理的模块,但在python3中更名为了pillow模块,名字虽然发生了改变,但是提供的方法和功能都是一样的-实战思路 :一张验证码所需要具备的因素:1、规范验证码背景图片的尺寸大小2、规范字体大小及要显示字体的个数3、设置背景及线条个数、增加识别难度第一步:设置一张自定义大小的背景图from PIL import Image # 生成一张图片 captcha = Image.new('RGB', size=(150,100), color=(255, 180, 120)) # 保存图片 captcha.save('captcha.png')第二步:填充背景图的颜色from PIL import Image, ImageDraw import random # 颜色随机 def get_line_color(): line_color = (random.randint(0, 250), random.randint(0, 255), random.randint(0, 250)) return line_color # 绘制小圆点 def draw_point(draw, point_chance, width, height): ''' :param draw: 画笔对象 :param point_chance: 绘制小圆点分布的几率 概率为 point_chance/100 :param width: 验证码宽度 :param height: 验证码高度 :return: ''' # 按照概率随机绘制小圆点 for w in range(width): for h in range(height): tmp = random.randint(0, 100) if tmp < point_chance: draw.point((w, h), fill=get_line_color()) if __name__ == '__main__': captcha_size = (150, 100) rgb_color=(255, 180, 120) # 生成一张图片 captcha = Image.new('RGB', size=captcha_size, color=rgb_color) width, height = captcha_size # 获取画笔对象 draw = ImageDraw.Draw(captcha) draw_point(draw, 10, width, height) # 保存图片 captcha.save('captcha.png')OK 目前为止代码的逻辑还并不是很难;接下来就是设置字体;添加字体的同时然后在顺路添加一些纵横线什么的;加大识别难度。接下来在写代码的同时我会把代码封装成函数或者类进行书写。也是为了更加方便大家的阅读性,所以下面代码和上面会有一些重复。第三步:添加文字及线条,增加识别难度from PIL import Image, ImageDraw, ImageFont # 绘制线条 def draw_line(draw, captcha_width, captcha_height): ''' :param draw: 画笔对象 :param captcha_width: 验证码的宽度 :param captcha_height: 验证码的高度 :return: ''' # 随机获取开始位置的坐标 begin = (random.randint(0,captcha_width/2), random.randint(0, captcha_height)) # 随机获取结束位置的坐标 end = (random.randint(captcha_width/2,captcha_width), random.randint(0, captcha_height)) draw.line([begin, end], fill=get_line_color()) # 按照RGB风格设置字体颜色 def get_font_color(): font_color = (random.randint(0, 150), random.randint(0, 150), random.randint(0, 150)) return font_color # 得到绘制的字符 def get_text(sources=None): if sources: sources = sources else: sources = string.ascii_letters + string.digits text = random.sample(sources,k=text_number) return ''.join(text) # 展示绘制的字体 def draw_text(draw, text, font, captcha_width, captcha_height, spacing=20): ''' :param draw: 画笔对象 :param text: 绘制的所有字符 :param font: 字体对象 :param captcha_width: 验证码的宽度 :param captcha_height: 验证码的高度 :param spacing: 每个字符的间隙 :return: ''' # 得到这一窜字符的高度和宽度 text_width, text_height = font.getsize(text) # 得到每个字体的大概宽度 every_value_width = int(text_width / 4) # 这一窜字符的总长度 text_length = len(text) # 每两个字符之间拥有间隙,获取总的间隙 total_spacing = (text_length-1) * spacing if total_spacing + text_width >= captcha_width: raise ValueError("字体+中间的空隙超过了图片宽度!") # 获取第一个字符绘制位置 start_width = int( (captcha_width - text_width - total_spacing) / 2 ) start_height = int( (captcha_height - text_height) / 2 ) # 依次绘制每个字符 for value in text: position = start_width, start_height print(position) # 绘制text draw.text(position, value, font=font, fill=get_font_color()) # 改变下一个字符的开始绘制位置 start_width = start_width + every_value_width + spacing if __name__ == '__main__': # 背景图大小尺寸 captcha_size = (150, 100) # 背景颜色 rgb_color=(255, 180, 120) # 字体大小 font_size = 30 # 展示图片最大数量 text_number = 4 # 生成一张图片 captcha = Image.new('RGB', size=captcha_size, color=rgb_color) width, height = captcha_size # 获取画笔对象 draw = ImageDraw.Draw(captcha) draw_point(draw, 10, width, height) # 得到绘制字体 text=get_text() # 获取字体对象 font = ImageFont.truetype('simkai.ttf', font_size) draw_text(draw, text, font, width, height) # 保存图片 captcha.save('captcha.png')至此,大体上的框架逻辑实现的差不多了,接下来在添加上一些纵横交错的线条;看一下# 绘制线条 def draw_line(draw, captcha_width, captcha_height): ''' :param draw: 画笔对象 :param captcha_width: 验证码的宽度 :param captcha_height: 验证码的高度 :return: ''' # 随机获取开始位置的坐标 begin = (random.randint(0,captcha_width/2), random.randint(0, captcha_height)) # 随机获取结束位置的坐标 end = (random.randint(captcha_width/2,captcha_width), random.randint(0, captcha_height)) draw.line([begin, end], fill=get_line_color()) if __name__ == '__main__': # 线条数量 line_number=4 # 绘制线条 for i in range(line_number): draw_line(draw, width, height) # 保存图片 captcha.save('captcha.png') 哈哈 效果还可以,很赞! 背景颜色也是可以设置随机的 ,我这里设置成了固定的颜色,大家在学习的过程中可以自行修改。在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
-实战本篇是对tkinter知识点的巩固及练习,整体需要大家在操作的时候;稍作修改;因为我把我每一步怎么做的步骤以及思路都给写上了,所以需要大家在练习的时候,仔细斟酌。思路步骤:1、在桌面创建长时间停留的窗口2、在窗口中绘制相关组件进行布局排版的调整3、根据相关业务需求进行调整及实现具体功能第一步:搭建窗口布局from tkinter import * tk = Tk() cv = Canvas(tk, width=200, height=30) tk.title("普门教育Tony老师定制的密码选择器") # 窗口组件的位置 tk.geometry('+500+200') cv.pack() tk.mainloop() 第二步: 绘制相关组件进行布局排版市面上流行的三种布局这里采用的是网格布局 f1 = Frame(tk) f1.pack(padx=20, pady=15) # 设置标签 Label(f1, text="密码长度:").grid(row=0, column=0) f1r = Frame(f1) f1r.grid(row=0, column=1) # 0 行 1 列 Entry(f1r, width=5).grid(row=0, column=1) Button(f1r, text='+').grid(row=0, column=3) Button(f1r, text='-').grid(row=0, column=4) 经过 网格布局 的排版,已经初见效果;界面看起来整洁了很多,Nice 接下来......Label(f1, text="密码强度:").grid(row=1, column=0) level = IntVar() level.set(3) f1rb = Frame(f1) f1rb.grid(row=1, column=1) Radiobutton(f1rb, text='简单', variable=level).grid(row=1, column=1) Radiobutton(f1rb, text='一般', variable=level).grid(row=1, column=2) Entry(tk, state='readonly').pack() Button(tk, text='生成密码并复制到剪切板').pack()密码这一块我设置了只允许可读而不可修改;这样就杜绝了某些错误异常判断的操作。到目前位置,我们的界面布局已经大致完工了;接下来主要是实现各个组件相关的业务功能第三步: 业务逻辑处理及功能的实现加减操作我这里做了一个条件处理,只有在数据大于4的时候才能递减。 # 加号 def plus(): leng.set(int(leng.get()) + 1) # 减号 def subtract(): lengVal = int(leng.get()) # 判断条件 if lengVal > 4: leng.set(lengVal - 1) leng = StringVar() leng.set(6) Entry(f1r, width=5,textvariable=leng, state='readonly').grid(row=0, column=1) Button(f1r, text='+', command=plus).grid(row=0, column=3) Button(f1r, text='-', command=subtract).grid(row=0, column=4) import string # 获取密码 def getPassword(): # 数字 str1 = string.digits # 小写字母 str2 = string.ascii_lowercase str3 = string.ascii_uppercase str4 = string.punctuation # 简单 - dicts = { 1: [str1], 3: [str1, str2, str3], 4: [str1, str2, str3, str4] } # 设置到 输入框中 pw.set(str1) Radiobutton(f1rb, text='简单', variable=level,value=1).grid(row=1, column=1) Radiobutton(f1rb, text='一般', variable=level,value=3).grid(row=1, column=2) Radiobutton(f1rb, text='复杂', variable=level,value=4).grid(row=1, column=3) pw = StringVar() Entry(tk,textvariable=pw,state='readonly').pack() Button(tk, text='生成密码并复制到剪切板', command=getPassword).pack() 经过我们的修改,已经能够成功返回获取的数据了,至此已经成功了一大半! 接下来让我们对程序进程再一次的修改; 通过将密码以及密码等级进行传递。# 获取密码 传递密码等级 def getPassword(leng, level): arr = cutlength(leng, level) # 数字 str1 = string.digits # 小写字母 str2 = string.ascii_lowercase str3 = string.ascii_uppercase str4 = string.punctuation # 简单 - dicts = { 1: [str1], 3: [str1, str2, str3], 4: [str1, str2, str3, str4] } # print(dicts) return makePassword(dicts[level], arr) 这里采用了分层;分别对要进行处理的密码等级进行划分;这样会使程序看起来能够更加的简洁、干净,方便大家的阅读。最重要的是 ---> 还能提高代码质量 # 根据密码等级 剪出数组 def cutlength(leng, level): res = [] for item in range(level, 1, -1): res.append(random.randint(1, leng - sum(res) - item + 1)) res.append(leng - sum(res)) random.shuffle(res) return res 这里已经能够获取到密码了,但是密码还是有一些规律可循,包括密码生成的时候;会按照固有的数据输出方式进行排版;这样显然是达不到我们的需求的,与此同时......干脆咱们在来一个 大洗牌 吧!# 根据提供的字典 制造密码数组 def makePassword(dicts, arr): res = [] for i in range(len(arr)): for j in range(arr[i]): res += random.choice(dicts[i]) print(res) random.shuffle(res) print(res) 考虑到点击按钮能够直接生成相关密码的同时还能够直接复制下来进行粘贴,这里我用到了另一个模块 clipboardimport clipboard # 获取密码 至 剪贴板 def getPw(): res = getPassword(int(leng.get()), level.get()) # 剪切板 clipboard.copy(res) # 设置到 输入框中 pw.set(res)最终成果的演示简单等级强度一般等级强度复杂等级强度在这个浮躁的时代;竟然还有人能坚持篇篇原创;如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。支持原创。感谢!
2022年12月
2022年10月
2022年09月
2022年08月
这个网站 要刷新很多次 然后才会有结果出现
爬虫中设置session会话 后面的多次请求都可以共用session中的cookie数据因为它的数据是放在服务器上的