1、第12章 tkinter编程案例112.1 tkinter简介Python标准库tkinter是对Tcl/Tk的进一步封装,与tkinter.ttk和tkinter.tix共同提供了强大的跨平台GUI编程的功能。作为扩展,tkinter.ttk提供了Combobox、Progressbar和Treeview等组件,tkinter.scrolledtext提供了带滚动条的文本框,messagebox、commondialog、dialog、colorchooser、simpledialog、filedialog等模块提供了各种对话框。tkinter常用组件组件名称组件名称说明说明Button按钮
2、Canvas画布,用于绘制直线、椭圆、多边形等各种图形Checkbutton复选框形式的按钮Entry单行文本框Frame框架,可作为其他组件的容器,常用来对组件进行分组Label标签,常用来显示单行文本Listbox列表框Menu菜单Message多行文本框Radiobutton单选钮,同一组中的单选钮任何时刻只能有一个处于选中状态Scrollbar滚动条Toplevel常用来创建新的窗口12.1 tkinter简介 tkinter开发基本步骤:编写通用代码,例如数据库操作 搭建界面,放置组件,设置组件属性,可以借助于PAGE 编写组件的事件处理代码 启动应用程序,启动消息主循环12.1 t
3、kinter简介12.2 用户登录界面例例12-1 tkinter实现用户登录界面。code例12_1.pyw12.3 选择类组件应用例例12-2 tkinter单选钮、复选框、组合框、列表框综合运用案例。code例12_2.pyw12.4 简单画图程序例例12-3 使用tkinter实现画图程序。code例12_3.pyw12.5 电子时钟例例12-4 使用tkinter实现电子时钟。code例12_4.pyw12.6 屏幕颜色选择器 例例12-5 获取并显示屏幕任意位置的颜色。code例12_5.pyw 例例12-6 使用tkinter实现抽奖式提问程序。code例12_6.pyw12.7
4、 抽奖式提问程序12.8 简易计算器程序 例例12-7 使用tkinter实现计算器程序。code例12_7.pyw1112.9 定时自动关闭的窗口 例例12-8 使用tkinter实现定时自动关闭的窗口。code例12_8.pyw12第13章 网络爬虫入门与应用1313.1 HTML与JavaScript基础 如果只是编写爬虫程序的话,毕竟不是开发网站,所以只要能够看懂HTML代码基本上就可以了,不要求能编写。当然,对于一些高级爬虫和特殊的网站,还需要具有深厚的JavaScript功底,或者JQuery、AJAX等知识。1413.1.1 HTML基础(1)h标签在HTML代码中,使用h1到h
5、6表示不同级别的标题,其中h1级别的标题字体最大,h6级别的标题字体最小。该标签的用法为:一级标题二级标题三级标题1513.1.1 HTML基础(2)p标签在HTML代码中,p标签表示段落,用法为:这是一个段落1613.1.1 HTML基础(3)a标签在HTML代码中,a标签表示超链接,使用时需要指定链接地址(由href属性来指定)和在页面上显示的文本,用法为:点这里1713.1.1 HTML基础(4)img标签在HTML代码中,img标签用来显示一个图像,并使用src属性指定图像文件地址,可以使用本地文件,也可以指定网络上的图片。例如:1813.1.1 HTML基础(5)table、tr、t
6、d标签在HTML代码中,table标签用来创建表格,tr用来创建行,td用来创建单元格,用法为:第一行第一列 第一行第二列 第二行第一列 第二行第二列 1913.1.1 HTML基础(6)ul、ol、li在HTML代码中,ul标签用来创建无序列表,ol标签用来创建有序列表,li标签用来创建其中的列表项。例如,下面是ul和li标签的用法:红色 绿色 蓝色2013.1.1 HTML基础(7)div标签在HTML代码中,div标签用来创建一个块,其中可以包含其他标签,例如:红色 绿色 蓝色 第一段 第二段2113.1.2 JavaScript基础(1)在网页中使用JavaScript代码的方式 可以
7、在HTML标签的事件属性中直接添加JavaScript代码。例如,把下面的代码保存为index.html文件并使用浏览器打开,单击按钮“保存”,网页会弹出提示“保存成功”。2213.1.2 JavaScript基础 对于较多但仅在个别网页中用到的JavaScript代码,可以写在网页中的标签中。例如,下面的代码保存为index.html并使用浏览器打开,会发现页面上显示的是“动态内容”而不是“静态内容”。静态内容 document.getElementById(test).innerHTML=动态内容;2313.1.2 JavaScript基础 如果一个网站中会用到大量的JavaScript代
8、码,一般会把这些代码按功能划分到不同函数中,并把这些函数封装到一个扩展名为js的文件中,然后在网页中使用。例如,和网页在同一个文件夹中的myfunctions.js内容如下:function modify()document.getElementById(test).innerHTML=动态内容;在下面的页面文件中,把外部文件myfunctions.js导入,然后调用了其中的函数:静态内容 modify();2413.1.2 JavaScript基础(2)常用JavaScript事件 把下面的代码保存为index.html并使用浏览器打开,会发现在每次页面加载时都会弹出提示,但在页面上进行其他
9、操作时,并不会弹出提示。静态内容 2513.1.2 JavaScript基础 除了常用的事件之外,还有一些特殊的方式可以执行JavaScript代码。例如,下面的代码演示了在链接标签中使用href属性指定JavaScript代码的用法。function test()alert(提示信息);点这里 2613.1.2 JavaScript基础(3)常用JavaScript对象 下面的代码演示了prompt()方法的用法,将其保存为文件index.html并使用浏览器打开,会提示用户输入任意内容,然后在页面上输出相应的信息。var city=prompt(请输入一个城市名称:,烟台);documen
10、t.write(你输入的是:+city);2713.1.2 JavaScript基础 把下面的代码保存为文件index.html,此时页面上会显示图像文件1.jpg的内容,单击该图像时会切换成为2.jpg的内容。2813.2 urllib基本应用与爬虫案例 Python 3.x标准库urllib提供了urllib.request、urllib.response、urllib.parse和urllib.error四个模块,很好地支持了网页内容读取功能。再结合Python字符串方法和正则表达式,可以完成一些简单的网页内容爬取工作,也是理解和使用其他爬虫库的基础。2913.2.1 urllib的基本
11、应用1.读取并显示网页内容 import urllib.request fp=urllib.request.urlopen(rhttp:/www.python.org)print(fp.read(100)#读取100个字节 print(fp.read(100).decode()#使用UTF8进行解码 fp.close()#关闭连接3013.2.1 urllib的基本应用2.提交网页参数(1)下面的代码演示了如何使用GET方法读取并显示指定url的内容。import urllib.request import urllib.parse params=urllib.parse.urlencode(
12、spam:1,eggs:2,bacon:0)url=http:/www.musi- with urllib.request.urlopen(url)as f:print(f.read().decode(utf-8)3113.2.1 urllib的基本应用(2)下面的代码演示了如何使用POST方法提交参数并读取指定页面内容。import urllib.request import urllib.parse data=urllib.parse.urlencode(spam:1,eggs:2,bacon:0)data=data.encode(ascii)with urllib.request.url
13、open(http:/requestb.in/xrbl82xr,data)as f:print(f.read().decode(utf-8)3213.2.1 urllib的基本应用3.使用HTTP代理访问页面 import urllib.request proxies=http:http:/:8080/opener=urllib.request.FancyURLopener(proxies)with opener.open(http:/www.python.org)as f:f.read().decode(utf-8)3313.2.2 urllib爬虫案例 例例13-1 爬取公众号文章中的图片
14、。第1步 确定公众号文章的地址,以微信公众号“Python小屋”里的一篇文章为例,文章标题为“报告PPT(163页):基于Python语言的课程群建设探讨与实践”,地址为:https:/ urllib爬虫案例第2步 在浏览器(以Chrome为例)中打开该文章,然后单击鼠标右键,选择“查看网页源代码”,分析后发现,公众号文章中的图片链接格式为:3513.2.2 urllib爬虫案例第3步 根据前面的分析,确定用来提取文章中图片链接的正则表达式:pattern=data-type=png data-src=(.+?)3613.2.2 urllib爬虫案例 第4步 编写并运行Python爬虫程序,代
15、码如下:from re import findallfrom urllib.request import urlopenurl=https:/ urlopen(url)as fp:content=fp.read().decode()pattern=data-type=png data-src=(.+?)#查找所有图片链接地址result=findall(pattern,content)#逐个读取图片数据,并写入本地文件for index,item in enumerate(result):with urlopen(str(item)as fp:with open(str(index)+.png
16、,wb)as fp1:fp1.write(fp.read()3713.3 scrapy爬虫案例 例例13-2 使用scrapy框架编写爬虫程序。第1步 使用pip命令安装好scrapy之后,在命令提示符环境中执行下面的命令创建一个项目MyCraw:scrapy startproject MyCraw3813.3 scrapy爬虫案例第2步 然后编写Python程序MyCrawMyCrawspidersMySpider.py,用于爬取指定页面的内容,把网页内容和图片分别保存为文件,MySpider.py的代码如下:codeMySpider.py3913.3 scrapy爬虫案例第3步 在命令提示
17、符环境中执行下面的命令,运行爬虫程序。scrapy crawl mySpider4013.3 scrapy爬虫案例 例例13-3 使用scrapy框架编写爬虫程序,爬取天涯小说。第1步 以天涯小说“宜昌鬼事之大宗师”为例,首先确定第一页的链接为:http:/ 然后查看并分析网页源代码,确定作者ID,确定如何查找作者发表的帖子而过滤其他跟帖,并确定该小说不同页的URL之间有什么规律。4113.3 scrapy爬虫案例第3步 把这些问题都确定之后,创建爬虫项目。1)进入命令提示符(cmd)环境,切换至Python安装目录的scripts目录,执行命令scrapy startproject xiao
18、shuo创建爬虫项目xiaoshuo,2)进入该目录,编写Python程序文件spidersspiderYichangGuishi.py,3)然后在命令提示符环境中执行命令scrapy crawl spiderYichangGuishi,稍等片刻即可爬取小说全文并生成记事本文档。codespiderYichangGuishi.py4213.4 BeautifulSoup用法简介 from bs4 import BeautifulSoup BeautifulSoup(hello world!,lxml)#自动添加标签hello world!BeautifulSoup(hello world!,l
19、xml)#自动补全标签hello world!4313.4 BeautifulSoup用法简介 html_doc=The Dormouses storyThe Dormouses storyOnce upon a time there were three little sisters;and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.4413.4 BeautifulSoup用法简介 soup=BeautifulSoup(html_doc,html.parser)#也可以指定lxml
20、或其他解析器 print(soup.prettify()#以优雅的方式显示出来 The Dormouses story The Dormouses story Once upon a time there were three little sisters;and their names were Elsie ,Lacie and Tillie ;and they lived at the bottom of a well.4513.4 BeautifulSoup用法简介 soup.title#访问标签的内容The Dormouses story soup.title.name#查看标签的名字
21、title soup.title.text#查看标签的文本The Dormouses story soup.title.string#查看标签的文本The Dormouses story soup.title.parent#查看上一级标签The Dormouses story soup.headThe Dormouses story soup.b#访问标签的内容The Dormouses story soup.body.b#访问中标签的内容The Dormouses story soup.name#把整个BeautifulSoup对象看作标签对象document4613.4 Beautiful
22、Soup用法简介 soup.body#查看body标签内容The Dormouses storyOnce upon a time there were three little sisters;and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.4713.4 BeautifulSoup用法简介 soup.p#查看段落信息The Dormouses story soup.pclass#查看标签属性title soup.p.get(class)#也可以这样查看标签属性title soup.
23、p.text#查看段落文本The Dormouses story soup.p.contents#查看段落内容The Dormouses story soup.aElsie soup.a.attrs#查看标签所有属性class:sister,href:http:/ BeautifulSoup用法简介 soup.find_all(a)#查找所有标签Elsie,Lacie,Tillie soup.find_all(a,b)#同时查找和标签The Dormouses story,Elsie,Lacie,Tillie4913.4 BeautifulSoup用法简介 import re soup.fin
24、d_all(href=pile(elsie)#查找href包含特定关键字的标签Elsie soup.find(id=link3)#查找属性id=link3的标签Tillie soup.find_all(a,id=link3)#查找属性link3的a标签Tillie for link in soup.find_all(a):print(link.text,:,link.get(href)Elsie:http:/ BeautifulSoup用法简介 print(soup.get_text()#返回所有文本The Dormouses storyThe Dormouses storyOnce upon
25、 a time there were three little sisters;and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.soup.aid=test_link1#修改标签属性的值 soup.aElsie soup.a.string.replace_with(test_Elsie)#修改标签文本Elsie soup.a.stringtest_Elsie5113.4 BeautifulSoup用法简介 for child in soup.body.children:#遍历直接子标
26、签 print(child)The Dormouses storyOnce upon a time there were three little sisters;and their names weretest_Elsie,Lacie andTillie;and they lived at the bottom of a well.5213.4 BeautifulSoup用法简介 test_doc=s=BeautifulSoup(test_doc,lxml)for child in s.html.children:#遍历直接子标签 print(child)for child in s.htm
27、l.descendants:#遍历子孙标签 print(child)5313.5 requests基本操作与爬虫案例 Python扩展库requests可以使用比标准库urllib更简洁的形式来处理HTTP协议和解析网页内容,也是比较常用的爬虫工具之一,完美支持Python 3.x,使用pip可以直接在线安装。安装成功之后,使用下面的方式导入这个库:import requests5413.5.1 requests基本操作(1)增加头部并设置访问代理 url=https:/ headers=user-agent:my-app/0.0.1 r=requests.get(url,headers=he
28、aders)5513.5.1 requests基本操作(2)访问网页并提交数据 payload=key1:value1,key2:value2 r=requests.post(http:/httpbin.org/post,data=payload)print(r.text)#查看网页信息,略去输出结果 url=https:/ payload=some:data r=requests.post(url,json=payload)print(r.text)#查看网页信息,略去输出结果 print(r.headers)#查看头部信息,略去输出结果 print(r.headersContent-Typ
29、e)application/json;charset=utf-8 print(r.headersContent-Encoding)gzip5613.5.1 requests基本操作(3)获取和设置cookies下面的代码演示了使用get()方法获取网页信息时cookies属性的用法:r=requests.get(http:/ requests基本操作下面的代码演示了使用get()方法获取网页信息时设置cookies参数的用法:url=http:/httpbin.org/cookies cookies=dict(cookies_are=working)r=requests.get(url,coo
30、kies=cookies)#设置cookies print(r.text)cookies:cookies_are:working 5813.5.2 requests爬虫案例 例例13-4 使用requests库爬取微信公众号“Python小屋”文章“Python使用集合实现素数筛选法”中的所有超链接。5913.5.2 requests爬虫案例 import requests url=https:/ r=requests.get(url)r.status_code#响应状态码200 r.text:300#查看网页源代码前300个字符n!-headTrap-n n nn 筛选法 in r.text
31、#测试网页源代码中是否包含字符串筛选法True r.encoding#查看网页编码格式UTF-86013.5.2 requests爬虫案例 links=re.findall(r for link in links:if link.startswith(http):print(link)6113.5.2 requests爬虫案例 from bs4 import BeautifulSoup soup=BeautifulSoup(r.content,lxml)for link in soup.findAll(a):#使用BeautifulSoup查找超链接地址 href=link.get(href)
32、if href.startswith(http):#只输出绝对地址 print(href)6213.5.2 requests爬虫案例 例例13-5 读取并下载指定的URL的图片文件。import requests picUrl=rhttps:/www.python.org/static/opengraph-icon-200 x200.png r=requests.get(picUrl)r.status_code200 with open(pic.png,wb)as fp:fp.write(r.content)#把图像数据写入本地文件6313.6 selenium爬虫案例 例例13-6 使用se
33、lenium编写爬虫程序,获取指定城市的当前天气。第1步 首先,查看一下本地计算机Windows操作系统的内部版本号,以我的Win10为例,步骤为:依次单击开始=设置=系统=关于,找到下图中的操作系统内部版本号:6413.6 selenium爬虫案例第2步 打开网址https:/ 打开命令提示符环境,使用pip安装扩展库selenium。第4步 编写如下程序代码:import refrom selenium import webdriver#指定引擎driver=webdriver.Edge()city=input(请输入要查询的城市:).lower()#获取指定URL的信息,并进行渲染driver.get(rhttp:/openweathermap.org/find?q=0.format(city)#网页内容渲染结束之后获取网页源代码,并转换成小写content=driver.page_source.lower()matchResult=re.search(rs+city+.+?,content)if matchResult:print(matchResult.group(0)else:print(查不到,请检查城市名字。)65