模块11 网络编程《Python 程序设计》教学课件_第1页
模块11 网络编程《Python 程序设计》教学课件_第2页
模块11 网络编程《Python 程序设计》教学课件_第3页
模块11 网络编程《Python 程序设计》教学课件_第4页
模块11 网络编程《Python 程序设计》教学课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Python程序设计》✩精品课件合集✩精品课件合集11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精选案例小结2023年9月23日2第十一章网络编程11.1Pycharm的安装与使用2023年9月23日3PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。PyCharm是由JetBrains打造的一款PythonIDE,同时支持GoogleAppEngine,PyCharm支持IronPython。这些功能在先进代码分析程序的支持下,使PyCharm成为Python专业开发人员和刚起步人员使用的有力工具。PyCharm分为专业版(Professional)和社区版(Community)。这两种版本的区别是:专业版功能全,适合专业开发人员,需要收费。社区版部分功能,适合学生、教育者,免费。相比专业版,社区版缺少专业版中的Web开发、PythonWeb框架、Python的探查、远程开发等功能。本书使用的Pycharm为社区版,并且安装环境是Windows操作系统。Pycharm的安装下载Pycharm社区版:Pycharm官网/pycharm/下载。安装Pycharm社区版:直接运行下载的“pycharm-community-2019.3.1”文件,注意根据操作系统来选择32-bitlauncher还是64-bitlauncher,32位操作系统就选32-bitlauncher,进行默认安装即可。启动Pycharm:双击桌面的或者从开始“菜单—程序—JetBrains--JetBrainsPycharmCommunityEdition2019.1”打开Pycharm。设置工程项目存放的路径和基本的解释器:这里要注意,必须已经安装了Python。安装需要的扩展包:如果需要使用第三方的库,则需要进行安装。本章及后续章节需要使用numpy、pandas、matplotlib、BeautifulSoup、requests等。11.1Pycharm的安装与使用2023年9月23日4Pycharm的使用新建Pycharm文件:右击项目文件,选择快捷菜单的“Pythonfile”。输入文件内容。运行*.py文件:①利用快捷键:CTRL+SHIFT+F10;②“Prject”资源管理器中找到文件单击右键,选择“Run*.py”;③编辑窗口上绿色三角形按键,单击运行(初次运行时不出现此按键)。结果查看:Pycharm的运行结果在窗口的左下角。常用快捷键:见下表。快捷键功能说明Ctrl+Enter在下方新建行,但不移动光标Shift+Enter在下方新建行,并移到新行行首Ctrl+/注释(取消注释)选择的行Ctrl+Alt+L格式化代码(与QQ锁定热键冲突关闭QQ的热键)Ctrl+Shift++展开所有的代码块Ctrl+Shift+-收缩所有的代码块Ctrl+Alt+I自动缩进行Alt+Enter优化代码添加包Ctrl+Shift+F高级查找Alt+Shift+Q更新代码到远程服务器Ctrl+D:对光标所在行的代码进行复制Alt+Shift+F10运行模式配置Shift+F10运行Ctrl+Shift+F10运行编辑器配置/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=pycharm%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&rsv_t=1877d6IBWRjk%2BEqmZ%2Bp7ylU9Tm4L3IHyCBsuiYOGcFBDr2%2Fnz3qMQ05F56M&rsv_enter=1&rsv_dl=ts_0&rsv_sug3=7&rsv_sug1=7&rsv_sug7=100&rsv_sug2=0&prefixsug=Pycharm&rsp=0&inputT=6319&rsv_sug4=63192023年9月23日5/du-hong/p/10244304.html/p/eb606812765d2023年9月23日6Python程序设计11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精选案例小结2023年9月23日8第十一章网络编程2023年9月23日9TCP/IP协议简介TCP/IP协议,即TransmissionControlProtocol/InternetProtocol的简写,中文名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP协议是一个四层协议系统,包括应用层、运输层、网络层、链路层,每一层负责不同的功能。各层的关系如下图。11.2TCP/IP协议简介2023年9月23日10端口一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。端口包括物理端口和逻辑端口。物理端口是用于连接物理设备之间的接口,逻辑端口是逻辑上用于区分服务的端口。TCP/IP协议中的端口就是逻辑端口,通过不同的逻辑端口来区分不同的服务,逻辑端口有65536个,范围从0到65535,系统默认占用的0-1023端口,用户可以使用的逻辑端口1024-65535。本章中用到的端口如不做特殊说明,都是指逻辑端口。在两台计算机通信时,只发IP地址是不够的,因为同一台计算机运行多个网络程序。每个网络程序都向操作系统申请唯一的端口号,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。IP地址与端口号共同来标识网络上特定主机上的特定应用进程,称为Socket。Socket模块的基本功能在Python中,主要使用Socket模块来支持TCP和UDP编程。Socket也称套接字,是网络编程的一个抽象概念,通常用一个Socket表示“打开一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。使用socket()创建套接字格式为:socket(family,type[,protocal]),使用给定的地址簇、套接字类型、协议编号(一般默认0)来创建套接字。其中套接字类型如下表所示。11.2TCP/IP协议简介socket类型描

述socket.AF_UNIX只能够用于单一的Unix系统进程间通信socket.AF_INET服务器之间网络通信(IPv4)socket.AF_INET6IPv6socket.SOCK_STREAM流式socket,用于TCP协议socket.SOCK_DGRAM数据报式socket,用于UDP协议socket.SOCK_RAW原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头socket.SOCK_SEQPACKET可靠的连续数据包服务创建TCPSocket:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)创建UDPSocket:s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)2023年9月23日11网络编程一般包含服务器端和客户端,Python网络编程中常用到的Socket函数分为服务器端和客户端函数。11.2TCP/IP协议简介socket函数描

述服务端socket函数s.bind(address)将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址s.listen(backlog)开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了s.accept()接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址客户端socket函数s.connect(address)连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误s.connect_ex(adddress)功能与connect(address)相同,但是成功返回0,失败返回errno的值公共Socket函数s.recv(bufsize[,flag])接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其它信息,通常可以忽略。s.send(string[,flag])发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小s.sendall(string[,flag])完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常s.recvfrom(bufsize[.flag])接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址s.sendto(string[,flag],address)发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数s.close()关闭套接字s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)s.setsockopt(level,optname,value)设置给定套接字选项的值s.getsockopt(level,optname[.buflen])返回套接字选项的值s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回Nones.fileno()返回套接字的文件描述符s.setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常s.makefile()创建一个与该套接字相关连的文件2023年9月23日12Python程序设计11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精选案例小结2023年9月23日14第十一章网络编程2023年9月23日15TCP是面向连接的通信方式,主动发起连接的叫客户端,被动响应连接的叫服务端。

11.3TCP编程【例11-1】TCP通信示例程序。创建TCP服务端程序一般需五个步骤:创建Socket套接字,并绑定Socket到本地IP和端口;开始进行监听连接;进入循环,不断接收客户端的连接请求;接受传来的数据,并发送给对方;传输完毕后,关闭Socket。TCP服务器端的程序如下:#eg11_1_s.py#TCP通信程序服务端importsocket#创建socket对象s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#获取本地主机名host=socket.gethostname()print(host)#设置端口号port=5272#绑定端口s.bind((host,port))#设置最大连接数,超过后排队s.listen(5)print("等待连接……")#建立客户端连接,并接收客户端的数据clientsocket,addr=s.accept()print("连接地址:%s,%s"%(str(clientsocket),str(addr)))whileTrue:#接收客户端数据d=clientsocket.recv(1024)d=d.decode('utf-8')ifd=='bye':breakprint(d)msg="欢迎来到Python的TCP网络编程世界!"+"\r\n" #发送信息给客户端clientsocket.send(msg.encode('utf-8'))#发送结束标志msg=‘bye’clientsocket.send(msg.encode(‘utf-8’))#关闭连接clientsocket.close()s.close()2023年9月23日1611.3TCP编程【例11-1】TCP通信示例程序。创建客户端TCP程序需要三个步骤:创建套接字socket,连接远端地址;连接后发送数据和接收数据;

传输完毕后,关闭套接字。

以下为一个简单的客户端代码,端口号为5272:#eg11_1_c.py#TCP通信程序客户端importsocket#创建socket对象s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#获取本地主机名host=socket.gethostname()#设置端口号port=5272#连接服务端,指定主机和端口s.connect((host,port))#接收小于1024字节的数据,打印接收的数据whileTrue:data=input('请输入你的数据:')#发送数据到服务端

s.send(data.encode('utf-8'))#接收服务端数据

data=s.recv(128)print(data.decode('utf-8'))ifdata.decode('utf-8')=='bye':break#关闭连接s.close()调试TCP通讯代码:运行服务器端代码:eg11_1_s.py运行客户端代码:eg11_1_c.py在客户端输入相关信息当客户端输入“bye”时,结束服务器端的socket连接,客户端在服务器端关闭后,会接收到”bye”,并且关闭socket。2023年9月23日17Python程序设计11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精选案例小结2023年9月23日19第十一章网络编程2023年9月23日2011.4UDP编程TCP通信需要一个建立可靠连接的过程,而且通信双方以流的形式发送数据。相对于TCP,UDP则是面向无连接的协议。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包,但是不关心是否能到达目的端。虽然用UDP传输数据不可靠,但是由于它没有建立连接的过程,速度比TCP快得多,对于不要求可靠到达的数据,就可以使用UDP协议。

使用UDP协议,和TCP一样,也有服务端和客户端之分。UDP编程相对于TCP编程比较简单,服务端创建只需要三个步骤:创建socket,绑定指定的IP和端口;直接发送数据和接收数据;关闭socket。客户端创建也需要三个步骤:创建socket;直接发送数据,提供服务端主机号、端口号和接收数据;关闭socket。【例11-2】UDP通信示例程序。服务端代码:#eg11_2_s.py#UDP通讯服务端importsocket#创建socket对象s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(('',5272))print("waitingformessage……")whileTrue:#接收数据d,a=s.recvfrom(1024)

#如果接收到"bye",则回复"byebye",并结束通讯ifd.decode('utf-8').lower()=='bye':s.sendto('byebye'.encode('utf-8'),a)breakprint(d.decode('utf-8'))#发送一个固定的回复信息s.sendto('thisistheUDPserver'.encode('utf-8'),a)#关闭sockets.close()2023年9月23日2111.4UDP编程【例11-2】UDP通信示例程序。客户端代码:#eg11_2_c.py#UDP通讯客户端代码importsockethost=socket.gethostname()port=5272c=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#循环发送信息whileTrue:message=input("请输入要传送的信息:")m=message.encode('utf-8')c.sendto(m,(host,port))d,a=c.recvfrom(1024)print(d.decode("utf-8"),a)#如果收到"byebye"则结束通讯ifd.decode(“utf-8”).lower()=='byebye':breakc.close()调试UDP通讯代码:运行服务器端代码:eg11_2_s.py运行客户端代码:eg11_2_c.py在客户端输入相关信息客户端输入的信息都会发送给服务端,并在服务端显示,同时服务端会返回一个固定的信息“thisistheUDPserver”给客户端。当客户端输入“bye”时,服务端收到后,返回“byebye”给客户端,同时关闭服务端socket连接,当然客户端收到“byebye”后,也会关闭客户端的socket连接。2023年9月23日22Python程序设计11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精选案例小结2023年9月23日24第十一章网络编程2023年9月23日2511.5网络爬虫

网络爬虫(Web

Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面开始,读取网页的内容,再找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。

网络爬虫的基本工作流程如下:

(1)首先选取一部分精心挑选的种子URL;

(2)将这些URL放入待抓取队列;

(3)从队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存进下载网页库;

(4)分析已抓取URL队列中的URL,从已下载的网页数据中分析其它URL,并和已抓取的URL进行比较去重,最后将去重过的URL放入待抓取URL队列,从而进入下一个循环。Python实现网络爬虫,主要依赖第三方库:

requests库:用来发起请求;

BeautifulSoup库:用来解析HTML结构并提取内容;Faker库:用来模拟请求UA(User-Agent)。2023年9月23日2611.5网络爬虫用urllib实现网络爬虫urllib系Python系统自带的库,提供了urllib.request请求模块、urllib.parse解析模块和urllib.error异常处理模块等模块,很好地支持了网页内容读取功能。【例11-3】使用urllib库来读取的内容。#eg11_3.py#简单的网络爬虫fromurllibimportrequestimportchardet#编码识别模块response=request.urlopen(“”)#打开访问的网页html=response.read()#读取网页#检测html的编码格式charset=chardet.detect(html)print(charset)#输出编码格式html=html.decode(charset.get('encoding'),errors='ignore')print(html)#输出网页内容这是网络爬虫最简单的应用。但是如果这样的爬虫多了,会影响网络响应,所以有时会出现服务器拒绝用户的访问请求。一些网站常用的反爬虫措施是检查headers中的User-Agent。如果使用Python编写的爬虫代码,没有对headers进行设置,则User-Agent会声明自己是Python脚本,而如果网站做了反爬虫设置,必然会拒绝这样带有Python脚本的请求。因此修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,这是常用的反拒绝手段。2023年9月23日2711.5网络爬虫用urllib实现网络爬虫(续)User-Agent域:是向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。常用的浏览器标识如下:'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)''Chrome/45.0.2454.85Safari/537.36115Browser/6.0.3','Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)',

'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)','Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1','Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11','Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11',

'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)','Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0',

'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1‘Referer域:当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。如用于统计访问量、防外连接等。2023年9月23日2811.5网络爬虫用urllib实现网络爬虫(续)【例11-4】对【例11-3】添加headers头信息后的爬虫代码。#eg11_4.pyfromurllibimportrequestimportchardetheaders={'User-Agent':'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)','Accept':r'application/json,text/javascript,*/*;q=0.01','Referer':r'/',}url=''req=request.Request(r'/',headers=headers)response=request.urlopen(req)html=response.read()charset=chardet.detect(html)#检测html的编码格式html=html.decode(charset.get('encoding'),errors='ignore')print(charset)print(html)req=request.Request(r'/',headers=headers)创建一个Request对象,并且能灵活地进行浏览器参数配置。2023年9月23日2911.5网络爬虫用requests实现网络爬虫requests库实现的是HTTP请求,是爬虫开发中最为常用的库。【例11-5】使用requests库的网络爬虫应用示例。#eg11_5.pyimportrequestsresponse=requests.get("")response.encoding="utf-8"print(response.text)利用requests库相比urllib库,代码更加简单。以上代码是基于get请求为例,接下来看看以post请求实现的网络爬虫代码。post请求也很简单,只要在请求时添加一个data参数,这个data参数可以通过字典构成。importchardetdatas={'key':'value'}target='/1_1094/5403177.html're=requests.post(url=target,data=datas)#获取网页的编码格式re.encoding=chardet.detect(re.content)['encoding']print(re.content)requests对headers的处理与urllib非常相似,在requests的get函数中添加headers参数即可。headers={'User-Agent':'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)','Accept':r'application/json,text/javascript,*/*;q=0.01','Referer':r'/',}response=requests.get((""),headers)response.encoding="utf-8"print(response.text)get方式post方式get方式+User-Agent2023年9月23日3011.5网络爬虫BeautifulSoup库的使用BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python第三方库,可以用它来方便地从网页中提取数据。有了它不用再去写一些复杂的正则表达式,只需要简单的几条语句就可以完成网页中某个元素的提取。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如lxml。由于lxml解析速度比标准库中的HTML解析器速度快得多,所以选择将lxml作为新的解析器。下表列出了主要解析器的优缺点。解析器使用方法优势劣势Python标准库BeautifulSoup(markup,“html.parser”)Python的内置标准库执行速度适中文档容错能力强Python2.7.3or3.2.2前的版本中文档容错能力差Lxml、HTML解析器BeautifulSoup(markup,“lxml”)速度快文档容错能力强需要安装C语言库Lxml、XML解析器BeautifulSoup(markup,[“lxml”,”xml”])BeautifulSoup(markup,“xml”)速度快唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup,“html5lib”)最好的容错性以浏览器的方式解析文档生成HTML5格式的文档速度慢2023年9月23日3111.5网络爬虫BeautifulSoup库的使用(续)>>>frombs4importBeautifulSoup#导入Beautiful/soup库#创建一个html对象>>>htmlstr='''<html><head><title>TheBeautifulSoup</title></head><body><pclass="title"name="bs1"><b>TheBeautifulSoup</b></p><pclass="story"name="bs2">BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。对象有:<ahref="/elsie"class="tag"id="link1"><!--Tag--></a><ahref="/lacie"class="navig"id="link2"><!--NavigableString--></a><ahref="/tillie"class="beautil"id="link3"><!--BeautifulSoup--></a>它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。</p><pclass="story">...</p>'''

>>>soup=BeautifulSoup(htmlstr,‘lxml’)#创建beautifulSoup对象>>>print(soup.prettify())提取的网页指定解释器格式化输出soup对象2023年9月23日3211.5网络爬虫BeautifulSoup库的使用(续)<html><head><title>

TheBeautifulSoup</title></head><body><pclass="title"name="bs1"><b>TheBeautifulSoup</b></p><pclass="story"name="bs2">BeautifulSoup提供一些简单的、Python式的函数用来处理导航、搜索、修改分析树等功能。对象有:

<aclass="tag"href="/elsie"id="link1"><!--Tag--></a><aclass="navig"href="/lacie"id="link2"><!--NavigableString--></a><aclass="beautil"href="/tillie"id="link3"><!--BeautifulSoup--></a>

它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

</p><pclass="story">...</p></body></html>2023年9月23日3311.5网络爬虫(1)对象类型BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment。

①Tag对象Tag,通俗点讲就是HTML中的标签。比如“<html><head><title>TheBeautifulSoup</title></head>”中,html、head、title这些HTML标签加上里面包括的内容就是Tag,使用BeautifulSoup可以很方便地获取Tag。前面的格式化输出代码soup.prettify(),是调用soup的方法prettify()获得的,soup对象具有title、a、p等HTML这些标签属性,通过soup.title、soup.a、soup.p等获得标签的内容。>>>print(soup.a)<aclass="tag"href="/elsie"id="link1"><!--Tag--></a>对于Tag,它有两个重要的属性,是

name和

attributes。

name属性每个Tag都有自己的名字,通过name获取。

>>>print()

[document]>>>print()

titlesoup对象本身比较特殊,它的name即为[document],对于其它内部标签,输出的值便为标签本身的名称。

attributes属性,soup对象的attributes属性用attrs表示,用于获取Tag中所有属性,Tag标签的属性用字典表示。>>>print(soup.p.attrs){'class':['title'],'name':'bs1'}获得了p标签以字典形式表示的内容。利用上述这种方式,查找到的是所有内容中第一个符合要求的标签,如果要查询所有标签,可自己查阅相关资料。如果想要单独获取某个属性,和获取字典中键值信息的方法一样。>>>print(soup.p["class"])['title']>>>print(soup.p.get('class'))['title']2023年9月23日3411.5网络爬虫②NavigableString对象用string获取标签内部的文字。>>>print(soup.p.string)TheBeautifulSoup>>>print(type(soup.p.string))<class'bs4.element.NavigableString'>③BeautifulSoup对象BeautifulSoup对象表示的是一个文档全部内容。大部分时候,可以把它当作Tag对象,是一个特殊的Tag,name属性和attribute属性同样可以使用。>>>print()[document]>>>print(soup.attrs){}>>print(type(soup.attrs))<class'dict'>④Comment对象Comment对象是一个特殊类型的NavigableString对象,其输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对文本处理造成意想不到的麻烦。>>>print(soup.a.string)Tag>>>print(type(soup.a.string))<class'bs4.element.Comment'>a标签里的内容实际上是注释,但是如果利用string来输出它的内容,发现它已经把注释符号去掉了,所以这可能会带来不必要的麻烦。另外打印输出它的类型,发现它是一个Comment类型。因此在提取字符串时,可以先判断一下类型,然后再进行其它操作。iftype(soup.a.string)==bs4.element.Comment:print(soup.a.string)2023年9月23日3511.5网络爬虫(2)findAll()函数搜索文档:BeautifulSoup定义了很多搜索方法,这里主要介绍findAll()方法。findAll()方法搜索当前Tag的所有子节点,并判断是否符合过滤器的条件,函数原型如下:findAll(name,attrs,recursive,text,limit,**kwargs)①name参数(查找标签)name参数可以查找所有名字为name的Tag。name参数取值可以是字符串、列表、True、方法、正则表达式。最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,BeautifulSoup会查找与字符串完整匹配的内容。下面的例子用于查找文档中所有的<b>标签:>>>print(soup.findAll('b'))

[<b>TheBeautifulSoup</b>]如果传入列表参数,BeautifulSoup会将与列表中任一元素匹配的内容返回。下面代码找到文档中所有<head>标签和<b>标签:>>>print(soup.findAll(['head','b']))[<head><title>TheBeautifulSoup</title></head>,<b>TheBeautifulSoup</b>]2023年9月23日3611.5网络爬虫True参数可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点:>>>fortginsoup.findAll(True):print(,sep=‘,’)Html,head,title,body,p,b,p,a,a,a,p,如果没有合适过滤器,那么还可以定义一个方法。方法只接受一个元素参数,如果这个方法返回True表示当前元素匹配并且被找到,如果不是则反回False。下面方法校验了当前元素,如果包含class属性和id属性,那么将返回True:>>>defhas_class_and_id(tag):returntag.has_attr('class')andtag.has_attr('id')>>>print(soup.findAll(has_class_and_id))[<aclass="tag"href="/elsie"id="link1"><!--Tag--></a>,<aclass="navig"href="/lacie"id="link2"><!--NavigableString--></a>,<aclass="beautil"href="/tillie"id="link3"><!--BeautifulSoup--></a>]2023年9月23日3711.5网络爬虫②**kwargs参数kwargs参数在Python中表示为关键字参数。如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字Tag的属性来搜索。如包含一个名字为id的参数,BeautifulSoup会搜索每个Tag的id属性:>>>print(soup.findAll(id='link1'))[<aclass="tag"href="/elsie"id="link1"><!--Tag--></a>]③text参数(查找文本)通过text参数可以搜索文档中的字符串内容。与name参数的可选值一样,text参数可以接受字符串、列表、True、正则表达式:>>>print(soup.findAll(text='TheBeautifulSoup'))['TheBeautifulSoup','TheBeautifulSoup’]2023年9月23日3811.5网络爬虫④limit参数findAll()方法返回全部的搜索结构,如果文档树很大那么搜索会很慢。如果不需要全部结果,可以使用

limit参数限制返回结果的数量。当搜索到的结果数量达到limit的限制时,就停止搜索返回结果。如文档树中有3个Tag符合搜索条件,但结果只返回了1个,因为限制了返回数量:>>>print(soup.findAll('a',limit=1))[<aclass="tag"href="/elsie"id="link1"><!--Tag--></a>]⑤recursive参数

调用Tag的findAll()方法时,BeautifulSoup会检索当前Tag的所有子孙节点,如果只想搜索Tag的直接子节点,可以使用参数recursive=False:>>>print(soup.findAll('title'))[<title>TheBeautifulSoup</title>]>>>print(soup.findAll('title',recursive=False))[]2023年9月23日3911.5网络爬虫⑥attrs参数用一个python字典封装一个标签的若干属性和对应的属性值,注意是对一个标签的属性,所以一定要指明这个标签。可以更好的区分众多相同的标签。格式:(”tag“,{"属性","属性值"}>>>soup.findAll('p',{"class":["title","story"]})[<pclass="title"name="bs1"><b>TheBeautifulSoup</b></p>,<pclass="story"name="bs2">BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。对象有:<aclass="tag"href="/elsie"id="link1"><!--Tag--></a><aclass="navig"href="/lacie"id="link2"><!--NavigableString--></a><aclass="beautil"href="/tillie"id="link3"><!--BeautifulSoup--></a>它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。</p>,<pclass="story">...</p>]2023年9月23日40Python程序设计11.1Pycharm的安装与使用11.2TCP/IP协议简介11.3TCP编程11.4UDP编程11.5网络爬虫11.6网络编程精

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论