《第二章--Python网络编程课件.pptx》由会员分享,可在线阅读,更多相关《第二章--Python网络编程课件.pptx(153页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章 Python网络编程第二章 Python网络编程2.1 网络网络基础基础2.2 Socket模块模块2.3 SocketServer模块模块2.4 Scapy基础基础2.5 Scapy高级用法高级用法2.6 urllib2和和cookielib模模块块2.7 Scrapy模块模块习题习题第二章 Python网络编程2.1 网网 络络 基基 础础2.1.1 OSI参考模型与参考模型与TCP/IP参考模型参考模型开放系统互连(OSI)参考模型是为实现开放系统互连所建立的通信功能分层模型,简称OSI参考模型。OSI参考协议为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性
2、和兼容性提供共同的参考。这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。OSI参考模型以及在通信中具体的功能如图2-1所示。 第二章 Python网络编程图2-1 OSI参考模型第二章 Python网络编程TCP/IP参考模型及相关协议如图2-2所示,其中各层的含义如下:(1) 应用层:向用户提供的各种应用服务协议,典型的有域名服务、网页服务等。(2) 传输层:在两个进程或者主机之间提供可靠或者不可靠的传输服务。(3) 网际层(或称网络互联层):处理来自传输层的分组发送请求。将分组装入IP数据报,填充报头,根据路由算法选择去往目的节点的路
3、径,然后将数据包发送适当的端口。第二章 Python网络编程(4) 网络接入层:该层的功能包括IP地址与物理硬件地址的映射,将上层数据封装成帧;基于不同类型的网络接口,网络接入层定义了通信方式和物理介质;作为TCP/IP协议的最底层,负责接收从网际层传来的IP数据报,并且将IP数据报通过底层物理网络发出去,或者从底层的物理网络上接收物理帧,解封装出IP数据报,交给网络层处理。第二章 Python网络编程图2-2 TCP/IP参考模型第二章 Python网络编程2.1.2 TCP三次握手以及五元组三次握手以及五元组“三次握手”指的是发送数据前的准备阶段。服务端和客户端之间通过TCP三次交互,建立
4、起可靠的双工连接,然后开始传送数据。三次握手的详细流程如下:(1) 第一次握手:客户端发送SYN分组(SYN=1, seq=j)到服务端,表示客户端请求同服务端建立连接,客户端的序列号是j,然后等待服务端确认。第二章 Python网络编程(2) 第二次握手:服务端收到客户端发来的SYN分组后,响应客户的SYN分组,置ACK位,应答序列号为j+1(ACK=1, seqack=j+1),同时也置位SYN(SYN=1, seq=k),服务端的序列号为k,即SYN+ACK分组。(3) 第三次握手:客户端收到服务端的SYN+ACK分组,向服务端返回确认分组ACK(ACK=1, seqack=k+1),此
5、分组发送完毕,客户端和服务端进入连接建立状态,完成三次握手。图2-3和图2-4分别给出了三次握手的工作方式以及实际抓取的数据包。第二章 Python网络编程图2-3 三次握手工作方式第二章 Python网络编程图2-4 三次握手数据包第二章 Python网络编程在实际通信过程中,客户端或者服务端往往有大量的网络连接,为了确保不同网络连接的数据互相之间不会串扰,比如浏览器收到的数据不会被送往邮件客户端,引入了五元组的概念用于识别每条网络连接。这个五元组为:源IP地址 源端口 目的IP地址 目的端口和传输层协议第二章 Python网络编程例如,图2-4对应的五元组就是192.168.1.19 20
6、588 52.81.9.223 80 TCP,其意义是,一个IP地址为192.168.1.19的客户机通过端口20588,利用TCP协议,和IP地址为52.81.9.223、端口为80的服务端建立了网络连接。五元组在网络编程中也称为Socket(套接字)。有了套接字,就可以唯一确定一条网络连接,也就是通信双方及其通信协议。网络编程的第一步就是建立套接字。第二章 Python网络编程2.2 Socket模块模块2.2.1 Socket基础基础Socket的字面意思就是插座,其本意就是通过插座可以连接电网,获得电力服务。而网络也是一样的,可以通过Socket获得网络连接的服务,只要建立标准的Soc
7、ket,程序就可以实现网络的通信服务。因此在Socket网络编程中,首先就是建立Socket,然后就是通信双方互相传输数据。第二章 Python网络编程1. 常量常量在Python语言提供的Socket模块中,常量主要分为地址簇和socket类型两部分,具体参数如表2-1中所示。第二章 Python网络编程2. Socket函数函数Socket模块中包含很多网络服务相关的函数,其中最常使用的是创建一个socket对象:socket.socket(family, type, proto)其中,family为地址簇;type为socket类型;proto默认为0或缺省。此外还有一些常用的函数如表2
8、-2所示。第二章 Python网络编程第二章 Python网络编程3. Socket对象方法对象方法在实际编程过程中,对象方法是编程中经常会用到的,也是我们学习的重点,表2-3中给出了一些常用的Socket对象方法。第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程2.2.2 Socket编程编程1. 客户端客户端/服务端通信模型服务端通信模型基于Socket连接的客户端与服务端通信模型如图2-5所示,整个通信过程如下:(1) 通信模型中服务端处于被动侦听状态,随时接受客户端的连接请求,是服务提供方。(2) 通信模型中的客户端是主动连接服务端的,是服务需求方。
9、第二章 Python网络编程(3) 通信模型中的客户端和服务端实际上都不是传统的主机或者计算机,而是进程。因此一台主机可以同时运行多个不同的客户端或者服务端。客户端和服务端可以在同一台或不同的主机上。进程根据协议的端口号识别。(4) 客户端通过connect函数调用同服务端建立连接。(5) 客户端和服务端互相传递数据。(6) 客户端和服务端关闭网络连接。第二章 Python网络编程图2-5 客户端/服务端通信模型第二章 Python网络编程2. TCP客户端客户端编写TCP客户端的思路比较简单,大体上是先创建一个Socket对象,然后将其与服务端相连接并发送数据,最后等待服务端的响应并将响应结
10、果输出。该编程的思路如图2-6所示。第二章 Python网络编程图2-6 TCP客户端第二章 Python网络编程第二章 Python网络编程3. TCP服务端服务端TCP服务端与客户端的主要区别是:服务端是等待客户来连接,所以在思路上应该进行相应的调整。编写TCP服务端的思路是,首先创建一个socket实例,然后将其与需要监听的地址端口进行绑定并开启监听,随后等待客户来连接并进行通信。图2-7给出了TCP服务端的工作流程。第二章 Python网络编程图2-7 TCP服务端第二章 Python网络编程4. TCP代理代理通过前面对TCP客户端、服务端的编写,我们已经对Socket编程有了初步的
11、了解。下面将完成一个TCP代理程序的编码。该TCP代理主要实现的是图2-8中所示的功能。第二章 Python网络编程图2-8 TCP代理功能示意图第二章 Python网络编程在这里,我们要实现的代理是将服务端的端口A代理到代理端口B上。所有客户端访问代理端口B的流量都被重定向到服务端的端口A,相当于代理端在客户端和服务端之间进行中转,因此上述流量可以在代理端进行劫持或者修改,其详细工作流程如图2-9所示。 第二章 Python网络编程图2-9 代理工作流程第二章 Python网络编程实现这样的TCP代理并不困难,核心的思想就是创建两个Socket,一个和客户端(C)被动通信,一个和服务端(S)
12、主动通信。下面先在函数server_loop中建立监听本地主机的Socket,具体代码如下:第二章 Python网络编程第二章 Python网络编程在server_loop中开启了一个新线程用于执行proxy_handler,创建监听服务端的Socket,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程最后将其余代码补全,分别编写main函数用于命令行解析和hexdump函数实现十六进制显示转换,receive_from函数实现数据接收,request_handler函数和response_handler函数分别实现
13、对数据包的修改,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程这里以代理FTP服务为例,在代理端将的端口21代理到本机的端口21,然后访问FTP服务。首先开启代理:rootkali:# python /root/TCP_Proxy.py 0.0.0.0 21 21 True然后,在客户端访问FTP服务,如图2-10所示。第二章 Python网络编程图2-10 FTP连接 第二章 Python网络编程与此同时,可以在代理端得到如下的结果:第二章 Python网络
14、编程第二章 Python网络编程第二章 Python网络编程2.3 SocketServer模块模块2.3.1 SocketServer基础基础SocketServer中包含了两种类,一种为服务类(server class);另一种为请求处理类(request handle class)。一般情况下,所有的服务都是先建立连接,也就是建立一个服务类的实例;然后开始处理用户请求,也就是建立一个请求处理类的实例。第二章 Python网络编程1. 服务类服务类SocketServer中提供了五种服务类,并提供了服务类的相关方法。常用的SocketServer服务类和相关方法分别如表2-4与表2-5所示
15、。第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程2. 请求处理类请求处理类要实现一项网络服务,还必须派生一个handler class请求处理类,并重写父类的handle( )方法。handle( )方法是用来专门处理客户端请求的。SocketServer模块提供的请求处理类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler。从名字可以看出,一个处理流式套接字;另一个处理数据报套接字。请求处理类的方法有三种,如表2-6所示。第二章 Python网络编程第二章 Pyth
16、on网络编程2.3.2 SocketServer编程编程根据服务类BaseServer和请求处理类BaseRequestHandle,创建服务端程序的基本流程如下:(1) 创建一个请求处理类,合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类(当然,也可使用BaseRequestHandler作为父类),并重写它的handle()方法。(2) 实例化一个服务类对象,在实例化时需要两个参数:服务类地址和之前创建的请求处理类的实例。(3) 调用服务类对象的handle_request()或serve_forever()方法开始处理请求。
17、第二章 Python网络编程具体的代码如下所示:第二章 Python网络编程第二章 Python网络编程2.4 Scapy基础基础Scapy(网址为https:/ Python网络编程图2-11 Scapy功能应用第二章 Python网络编程Scapy内置大量的操作命令,支持Internet使用的各种网络协议,从而使得Scapy成为名副其实的交互式网络操作工具。Scapy的lsc命令可以显示模块中可用的命令,每条命令的详细用法可以用help查阅,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程运行ls()命令可以获取Scapy支持的所有协议,具
18、体代码如下:第二章 Python网络编程2.4.1 数据包的查看数据包的查看Scapy提供多种方法显示网络分组的详细信息。其中,方法ls( )显示的信息较为详细,包括字段类型、字段默认值和实际值,具体代码如下: ls(IP() # 只显示IP协议层的数据包第二章 Python网络编程第二章 Python网络编程命令show( )也能显示网络分组的相关信息,而且更为简洁和直观,在实际中经常使用。第二章 Python网络编程使用pdfdump( )函数以及psdump( )函数可以将数据包转化为pdf文件和eps文件,以实现图形化显示数据包内容,见图2-12。在这里以pdfdump( )为例,具体
19、代码如下:第二章 Python网络编程图2-12 pdf图形化显示数据包内容第二章 Python网络编程此外,还可以通过各种形式解析数据包,比如转化成字符串或十六进制的形式,甚至转化为字符串的数据包也能通过Ether( )方法进行解析。第二章 Python网络编程2.4.2 数据包的构造数据包的构造1. 简单构造简单构造网络中所有数据的交换都是通过数据包的传输实现的,如果想要创建一个自己想要的数据包,Scapy提供了非常简单的实现方法。前面我们已经通过ls()函数可知Scapy所支持的各种网络协议。第一种方法,是在构造每种网络协议数据包的同时修改字段信息,具体代码如下:第二章 Python网络
20、编程第二章 Python网络编程第二种方法,则是先构造默认数据包,再对字段值进行修改,也可以达到同样的效果。具体代码如下:第二章 Python网络编程上例中给出了创建IP数据包的方式,数据包中的每一个字段都是可以设置的,也可以通过笛卡尔积的方式一次性生成多个数据包。第二章 Python网络编程2. 协议栈协议栈我们知道,计算机网络采用的是分层体系结构,也就是说,通常一个完整的数据包是由多个协议组成的。为此,Scapy也是采用分层次的方式实现各层协议,利用运算符“/”实现不同层协议数据的拼接。除此以外,Scapy各层协议的数据包均继承于Packet,各层之间又彼此包含。Scapy协议栈的工作方式
21、如图2-13所示。 第二章 Python网络编程图2-13 Scapy协议栈第二章 Python网络编程从图中可知,协议字段可以分为三种类型:默认字段、根据上层协议自动设置的重载字段以及用户设置字段。例如:第二章 Python网络编程2.4.3 数据包的发送与接收数据包的发送与接收知道了如何构造、查看数据,我们进一步学习通过数据包实现信息的传输。单纯实现数据包发送的函数包括send()和sendp(),唯一的区别是send()函数在第三层协议(网络层)发送数据包,而sendp()函数在第二层协议(数据链路层)发送数据包。例如:第二章 Python网络编程sr()函数包含参数inter、retr
22、y和timeout。其中,inter参数设置两个数据包之间的发送时间间隔。retry参数用来设置重新发送所有无应答数据包的次数,如果retry设置为3,那么Scapy会对无应答的数据包重复发送三次;如果retry设为负数,则Scapy会一直发送无应答的数据包,直到没有更多的响应返回为止。timeout参数指定了每个数据包的等待时间。例如:第二章 Python网络编程第二章 Python网络编程查看sr()接收的信息:第二章 Python网络编程可以看到,ans0由发送的数据包与接收的数据包两部分组成。最后以sr()为例实现TCP路由跟踪,具体代码如下:第二章 Python网络编程前面介绍的都是
23、进行单一收/发的函数,下面介绍一个可以循环收/发的函数srloop( )函数,具体代码如下:第二章 Python网络编程下面介绍fuzz()函数。Fuzz()函数的作用是可以更改协议中一些默认的不可以被计算的字段(比如校验和checksums是可计算的字段),更改的字段值是随机的,但其类型是符合字段值规定的。例如,对IP协议的部分字段采取随机值进行填充,可以用以下代码实现:第二章 Python网络编程第二章 Python网络编程显然,IP协议中的部分字段,例如版本(version)、生存时间(ttl)都被随机数所填充,每次调用fuzz()函数,都会用一个随机值来填充该字段。Scapy模块提供的
24、这种随机填充字段值的特性,在一定程度上可以模糊化测试协议的安全漏洞。第二章 Python网络编程下面以网络时间协议(NTP)为例,进一步说明fuzz()函数的使用,具体代码如下:第二章 Python网络编程第二章 Python网络编程然后,对使用fuzz( )前、后的NTP协议分组进行对比。使用fuzz()函数前:获得的数据包如图2-14所示。第二章 Python网络编程图2-14 未使用fuzz()的数据包第二章 Python网络编程使用fuzz( )函数后,构造的数据包如图2-15所示。图2-15 使用fuzz( )的数据包第二章 Python网络编程相信大家能很容易地发现其中的区别:fu
25、zz( )函数修改了NTP的mode字段,进行了随机填充。但是要注意的是,版本字段(version)原本也是属于要随机填充的字段,由于构造分组时给了明确的数值是4,因此没有随机填充。第二章 Python网络编程2.4.4 Scapy模拟三次握手模拟三次握手使用TCP协议实现可靠数据传输之前都需要先建立网络连接。在Socket编程时,是通过调用conncet函数来实现三次握手的,在此使用Scapy来模拟三次握手的过程,与此同时进行“抓包”,其结果如图2-16所示。具体程序如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程在Kai
26、l下,因为通过sr( )发出的数据包在内核中并没有记录,导致内核对于119.97.134.253返回的SYN,ACK应答数据包会回复RST数据包结束握手,因此在运行程序前,要先使用防火墙过滤所有发往119.97.134.253的TCP RST 数据包:rootkali:# iptables -A OUTPUT -p tcp -tcp-flags RST RST d 119.97.134.253 -j DROP再运行程序,通过抓包可以得到如图2-16所示结果。第二章 Python网络编程2-16 模拟三次握手第二章 Python网络编程2.5 Scapy高级用法高级用法2.5.1 网络嗅探网络嗅
27、探提到网络嗅探,我们第一个会想到的工具是Wireshark,但如果主机上没有或者不支持安装Wireshark,那么也不用担心,Scapy为我们提供了嗅探函数sniff( )函数。下面介绍嗅探数据包。sniff( )函数的原型声明如下:sniff(filter=, iface=any, prn=function, count=N)第二章 Python网络编程 其中各参数的含义如下:(1) filter参数:对Scapy嗅探的数据包指定一个BPF(Wireshark类型)的过滤器;也可以留空以嗅探所有的数据包。(2) iface参数:设置要嗅探的网卡;留空则对所有网卡进行嗅探。(3) prn参数:
28、指定嗅探到符合过滤器条件的数据包时所调用的回调函数,这个回调函数以接收到的数据包对象作为唯一的参数。第二章 Python网络编程(4) count参数:指定需要嗅探的数据包的个数;留空则默认为嗅探无限个。以下示例可嗅探五个数据包,并调用匿名函数来显示每个数据包的源、目的IP地址以及负载数据。其中的x就是传递的参数,该值是满足过滤条件的单个数据分组。具体代码如下:第二章 Python网络编程第二章 Python网络编程注注:在学习Scapy模块及其他模块时,一定要随时留意所操作的对象类型,以免误用。例如创建一个数据或者捕获一个数据包给一个变量pkt,可以用type函数来获知该对象的类型,并进一步
29、用dir函数获知该对象的操作方法和属性。第二章 Python网络编程2.5.2 处理处理PCAP文件文件PCAP是最常使用的数据包文件存储格式。PCAP文件可以通过wireshark或者sniff函数来获取。Scapy提供相应的读取和解析函数rdpcap( )和wrpcap( ),代码如下:第二章 Python网络编程第二章 Python网络编程此外,还有其他的查看方式,如表2-7所示。第二章 Python网络编程1. 保存读取保存读取PCAP下面我们将上面嗅探到的数据包进行保存,使用wrpcap( )函数,代码如下: wrpcap(“temp.cap”,a)2. 路由路由可以通过conf.r
30、oute查看Scapy自身的路由表,如下所示: conf.route第二章 Python网络编程并可以对其进行修改,相关函数如表2-8所示。第二章 Python网络编程2.5.3 添加新协议添加新协议添加新的协议,或者准确地说是新的协议层,对于Scapy来说是很简单的事情,其中所有的核心在于字段。Scapy中的每一个协议层都是Packet类的子类,协议层操作背后所有的逻辑都是由Packet类来处理和继承的。简单的协议层就是由一系列的字段所组成的。这些字段在属性fields_desc中定义。第二章 Python网络编程在上述实例中,协议层包含三个字段,分别是:(1) 2字节的整型字段,名为mic
31、key,默认值为5。(2) 1字节的整型字段,名为minnie,默认值为3;XByteField是十六进制表示。(3) 4字节的整型字段,名为donald,同IntField区别在于,字段的取值用文字常量表示,类似于枚举类型。例如,如果donald等于3,那么显示时其值为angry。同样,在赋值时,如果donald等于cool,那么其值实际上就是2。第二章 Python网络编程以下是对于新的协议类Disney的用法举例:第二章 Python网络编程2.6 urllib2和和cookielib模块模块2.6.1 urllib2模块模块1. urllib2模块基础模块基础urllib2模块主要用于
32、对URL(Uniform Resource Locator)的处理。URL可以简单地理解为网址,它通常的组成方式如下:http:/ Python网络编程其中:http表示超文本传输协议;表示域名;user表示路径名;index.php表示文件名;v1=xyz、v2=123表示参数,参数之间用&符号隔开。urllib2模块中定义了许多函数和类,以帮助打开HTTP协议下的URL。表2-9、表2-10分别对urllib2模块中主要的函数和类进行了说明。第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程2. urllib2模块编程模块编程通过urllib2模块可以很方
33、便地获取网页的相关信息:第二章 Python网络编程得到的网页信息如图2-17所示。图2-17 网页信息第二章 Python网络编程2.6.2 cookielib模块模块1. cookielib模块基础模块基础cookielib模块的主要作用是提供可存储Cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。表2-11给出了处理HTTP Cookie的cookielib模块的主要类。第二章 Python网络编程第二章 Python网络编程2. cookielib模块编程模块编程下面将通过三个代码,分别展示通过cookielib模块与urllib2模块对Cookie信息
34、进行获取、保存以及使用。1) Cookie信息获取Cookie信息获取代码如下:第二章 Python网络编程第二章 Python网络编程可以得到Cookie信息()如下:第二章 Python网络编程2) Cookie信息保存在Cookie信息保存的过程中,需要使用cookie.save( )方法。cookie.save( )方法有两个参数:ignore_discard和ignore_expires。ignore_discard为True时,代表即使cookies将被丢弃也将它保存下来;ignore_expires为True时,如果在保存文件中已经存在cookies,则覆盖原文件写入。第二章 P
35、ython网络编程我们可以在cookie.txt文件中查看Cookie信息,如图2-18所示。图2-18 cookie.txt文件第二章 Python网络编程3) Cookie信息使用下面将展示一个根据cookie.txt文件中已经存储的Cookie信息,再次进行网站访问的例子。具体代码如下:第二章 Python网络编程第二章 Python网络编程2.6.3 网络爬虫网络爬虫1. 网络爬虫网络爬虫网络爬虫又称为网页蜘蛛、网络机器人,是一种按照一定规则,自动地爬取万维网信息的程序或脚本。网络爬虫是搜索引擎抓取系统的重要组成部分,爬虫的主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备
36、份。网络爬虫的基本流程如图2-19所示。第二章 Python网络编程图2-19 网络爬虫第二章 Python网络编程2. 爬虫模拟登录原理爬虫模拟登录原理HTTP是一种无状态的协议,即一旦数据交换完毕,客户端与服务端之间的连接就会关闭,再次交换数据需要重新建立连接。因此客户端再次向服务端发送请求时,服务端无法辨别这两个客户端是否为同一个。为了弥补HTTP协议此方面的不足,Cookie机制被提出。当客户端向服务端发送一个请求后,服务端会给它分配一个标识(Cookie),并保存到客户端本地;当客户端再次发送请求时,会把Cookie一起发送给服务端,服务端通过Cookie识别出客户端,就不需要再对客
37、户端进行认证,可以直接将客户端需要的信息发送给它。第二章 Python网络编程注注:Cookie格式如下:Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE爬虫模拟登录就是要做到模拟一个浏览器客户端的行为,首先将你的基本信息发送给指定的URL,服务端进行验证后返回一个Cookie;然后就利用这个Cookie进行后续的爬取工作。第二章 Python网络编程3. 爬虫模拟登录实现爬虫模拟登录实现下面将模拟登录目标网站,采用Fiddler调试工具,记录浏览器和服务端之间的所有http和https请求。首先进入
38、目标网站的登录页面,打开Fiddler调试工具,在目标网站的登录页面中输入账号、密码和验证码进行登录;观察Fiddler调试工具中的变化,可以得到登录过程中浏览器提交给服务端的headers和request等信息,如图2-20所示。第二章 Python网络编程图2-20 登录相关信息第二章 Python网络编程根据Fiddler工具捕获的HTTP流量,可以发现我们登录的页面网址是http:/accounts. Python网络编程我们完成了整个爬虫模拟登录的实现。整个过程可以总结如下:首先构造opener并打开页面,从中提取中验证码的id和url,并将其保存到本地;然后将验证码的相关信息保存到
39、要POST提交的字典data中;最后打开页面进行登录即可!第二章 Python网络编程2.7 Scrapy模块模块Scrapy模块是Python开发的一个用于爬取网站(或网页)并提取结构化数据的应用程序框架,被广泛用于数据挖掘、信息处理或存储历史数据等方面。尽管其最初是为了爬取网页内容而设计的,但后来也被用于APIs(例如Amazon Associates Web Services)提取数据和通用网络爬虫。Scrapy模块使用了Twisted异步网络库来处理网络通信,其整体架构如图2-21所示第二章 Python网络编程图2-21 Scrapy模块整体架构第二章 Python网络编程2.7.1
40、 Scrapy基础基础1. Scrapy组件组件Scrapy组件如表2-12所示。第二章 Python网络编程第二章 Python网络编程2. Scrapy运行流程运行流程(1) Scrapy Engine从Spider获得初始请求开始爬取。(2) Engine开始请求调度程序,并准备对下一次的请求进行爬取。(3) 调度器返回下一个请求给引擎。(4) 引擎通过调度器中间件发送请求给下载器。(5) 下载器完成页面下载后,产生一个响应并将该响应发送给引擎。第二章 Python网络编程(6) 引擎将来自下载器的响应通过中间件返回给爬虫进行处理。(7) 爬虫处理响应并通过中间件将处理后的items和新
41、的请求发送给引擎。(8) 引擎将处理后的Items发送给实体管道,然后将处理结果返回给调度器,并要求获得下一步要爬取的请求。(9) 重复上述过程,直到爬取完所有的URL请求为止。第二章 Python网络编程2.7.2 Scrapy爬虫爬虫本次案例爬取的是电影网站上电影的标题、链接、评分以及格言。种子链接是:https:/ 创建项目:scrapy startproject douban。创建实例:scrapy genspider film 。其中,创建的实例名称(film)不能与项目名(douban)重复。文档目录如图2-22所示。第二章 Python网络编程图2-22 文档目录第二章 Pyth
42、on网络编程文档目录中各项的主要功能如下:第二章 Python网络编程(2) 在douban/items.py中定义要爬取的对象:第二章 Python网络编程(3) 在spider目录下的film.py脚本中添加以下代码来提取信息:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程(4) 在命令行中运行以下代码开始爬取:scrapy crawl film -o data.csv(5) 查看data.csv文件,爬取结果如图2-23所示。第二章 Python网络编程图2-23 爬取结果第二章 Python网络编程习习 题题1. 使用socket库实现UDP客户端
43、以及服务端,并实现它们之间的通信。2. 利用socket库的connect函数实现扫描程序,并判别对方系统的端口开放情况。第二章 Python网络编程3. 漏洞扫描程序如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程4. 将2.3节中SocketServer部分代码的TCPServer替换为ThreadingTCPServer,再重复客户端和服务端之间的通信步骤,对比两次运行情况的区别。5. 通过ICMP实现数据的隐匿传输。(参考答案:ICMP( )/“hello” )6. 编写UDP程序,并将消息message字符串隐藏到目的端口号中。(提示:将message转换成二进制比特流,然后不同目的端口代表0或者1。)7. 通过Scapy实现ping扫描。