-
-
[转帖]VSRC唯科普 | 数据采集之初始网络通信(第1/14篇)
-
发表于: 2017-6-22 16:51 2275
-
数据采集之初始网络通信
VSRC唯科普 | 基于Python的数据采集(第1/14篇)
VSRC 唯科普 来了!
唯科普是VSRC一个面向大众的科普专栏,唯科普旨在分享各种有趣的干货文章,将会由浅入深,推出各种专题连载,此次的《小白终结者系列之“基于Python的数据采集》,暂定有14个篇,该系列将会从底层网络通信开始,讲解数据包的传递,正则表达式的书写,基于API的数据采集,数据存储,文件读取,数据清洗,自然语言处理等。希望唯科普,能受到大家的喜欢。大家若有任何想法,欢迎随时与我们交流。
第1/14篇 初识网络通信
当面对海量数据,要如何筛选?如何辨别?更进一步的,要如何变为有效资源?
一旦当你开始尝试采集网络中的数据后,便会意识到浏览器的诸多细节,所带来的便捷。难以想象,网络上若没有HTML文本格式,CSS样式层,JS执行层与图像渲染层,浏览器将会变成什么样子。而如今,大多数上网用户,通常只会关注页面内容,而不会关注其背后的数据交互。但是,网络数据采集,则需要抛开重重交互接口的遮挡,不仅是在浏览器层面,有时候也包括网络连接层。
让我们从OSI七层参考模型开始,理解网络中的数据传输基本原理。之后再通过一次完整的HTTP通信,看下Web浏览器与Web服务器之间是如何通信的。最后通过简短的一小段Python代码,采集网页中的数据。其中我们会模拟向服务器发送GET请求获取网页信息,从HTML页面内读取内容,最后做一些简单的数据提取,将所需要的内容分离出来。
在20世纪70年代末期,国际标准化组织创建了OSI开放式系统互联标准模型,用于在不同厂家之间,创建可统一通信的网络设备及软件。OSI参考模型分为七层,其中高3层定义端用户如何互相通信,底4层定义数据如何从端到端传输的,每层具体的分工如下:
(1)Application 层:提供应用程序等服务;
(2)Presentation 层:提供数据加密,压缩和翻译等;
(3)Session 层:会话控制;
(4)Transport 层:提供端到端的连接;
(5)Network 层:路由选路层;
(6)Data Link 层:数据封装层;
(7)Physical 层:定义物理拓扑等结构;
详细的分工如下:
Application Layer:
应用层作为实际应用程序的接口,通过把应用程序的有关信息送达到协议栈的下面各层,它只是应用程序的一个接口,需要处理远程资源时才会起作用,应用层还负责识别并建立通信一方的可用性。
Presentation Layer:
表示层因其用途而得名,它为应用层提供数据,并负责将数据转换和代码的格式化。提供数据压缩加密转换服务,例如tiff jpeg midi rtf 等。
Session Layer:
会话层负责建立、管理和终止表示层实体之间的session会话连接,在系统之间协调通信过程,并提供3种不同的方式来组织通信:全双工,半双工和单工(full duplex ,half duplex simplex)通信。会话层基本上用来使不同应用程序的数据与其它应用程序的数据保持隔离。一些会话层协议和接口的例子有:
(1)Network File System(NFS)
(2)Structured Query Language(SQL)
(3)Remote Procedure Call(RPC)
(4)X Window
(5)AppleTalk Session Protocol
(6)Digital Network Architecture Session Control Protocol(DNA SCP)
Transport Layer:
传输层将数据分段并重组为数据流(data stream)。TCP与UDP 都工作在传输层,当采用TCP/IP协议时,程序开发者可以在这2 者之间做出选择。传输层负责为实现上层应用程序的多路复用,建立会话连接和断开虚电路提供机制。通过提供透明的数据传输,他也对高层隐藏了任何与网络有关的细节信息。
流量控制:(flow control)
在传输层通过进行流量控制,以及通过在系统之间允许用户请求可靠的数据传输, 保证数据的完整性。流量控制可以防止在连接侧的发送主机,导致接受主机的缓冲区产生溢出。缓冲区溢出将导致数据的不完整。如果数据发送方传输数据过快,接受方将数据报(datagrams)暂时存储在缓冲区(buffer),可靠的数据传输采用了面向连接(connection-oriented)通信方式,保证:
(a).接受方接受到被传输的段(segment)以后将发回确认(acknowledge)给发送方。
(b).任何没有经过确认的数据段将被重新传输。
(c).数据段在达到接受方之前应按照适当的方式传输。
(d).进行流控技术从而避免数据报文的拥塞,超载(overloading)和丢失。
面向连接的通信:( connection-oriented communication)
在可靠的传输层中,一个想要传送的设备同过创建会话与远程设备建立连接,通常称为“三次握手协议”(three-way handshake):
(a).第一个”同意连接”数据段用来请求同步。
(b).第二个,第三个数据段用来确认请求,并在主机之间建立连接参数。这里,接受方的排序也要求进行同步,以便建立双向连接。
(c).最后一个数据段也用来确认。她通知目的主机已同意建立连接,并且已经建立了实际的连接。可以开始数据传输。当传输数据量过大时,会出现一些问题,某一台机器收到大量的数据包,数度太快,造成缓冲区溢出,最后不得不丢弃随后到来的所有数据包。但不用担心,网络中有流量控制系统,出现这种情况,接收方会发出一个not ready 的信号,待处理完毕后,又发出 ready,go on 的信号,继续传输。
Network Layer:
网络层负责设备的寻址,跟踪网络中设备的位置,并决定传送数据的最佳路径。路由器和3 层交换机工作在这个层上。路由工作原理:首先,接受到一个包,然后检查其目的ip,查询路由表,选择最佳路径,选择一个端口,包就被送到那个端口,并被封装成帧,送出本地网络,如果在路由表里找不到相应的目的网络的表项,则自动丢弃该包。
网络层有2 种类型的包(packets):数据包(data)和路由更新(router update)包,前者,很显然,用来传送用户数据。后者,用来向相邻路由器通知连接到网络的所有路由器的更新信息。这种协议为主动路由协议,如RIP、EIGRP、OSPF等。
Data link Layer:
数据链路层负责数据的物理传输,错误检测,网络拓扑和流控。这意味着在数据链上将根据硬件地址来进行投递,还要把Network Layer的包翻译成比特用于在PhysicalLayer上传输。IEEE 以太网(Ehernet)的Data Link Layer 有2 个子层:
(a).Media Access Control(MAC)802.3:这层定义了物理地址和拓扑结构,错误检测,流控制等。共享带宽,先到先服务原则(first come/first served)。
(b).Logical Link Control(LLC)802.2:负责识别Network Layer 协议然后封装(encapsulate)数据。LLC 头部信息告诉Data Link Layer 如何处理接受到的帧,LLC 也提供流控制和控制比特的编号。
Physical Layer:
物理层负责发送和接受比特。比特由1或者0组成。这层也用于识别数据终端装备(data terminal equipment,DTE)和数据通信装备(data communication equipment,DCE)的接口DCE,一般位于服务商(sevice provider),而DTE一般是附属设备。可用的DTE服务通常是经由modem或者channel service unit/data sevice unit(CSU/DSU)来访问。
而在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
步骤1、 建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接。
步骤2、Web浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,
例如:GET/sample/hello.jsp HTTP/1.1
步骤3、Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
步骤4、 Web服务器应答
客户端向服务器发出请求后,服务器会回复一个应答信号,应答的第一部分是协议的版本号和应答状态码。
下面是一个最简单的应答:
HTTP/1.1 200 OK
Content-Type: text/plain
Hi!
步骤5、 Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
步骤6、 Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
步骤7、Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:请求方法URI协议/版本、请求头(Request Header)及请求正文。
下面是一个HTTP请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,/
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=Joke&password=1234
(1) 请求方法URL协议/版本:
请求的第一行是“方法/URL协议/版本”:GET/sample.jsp HTTP/1.1
以上代码中“GET”代表请求方法,“/sample.jsp”表示URL,“HTTP/1.1代表协议和协议的版本。根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP/1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。在Internet应用中,最常用的方法是GET和POST。URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。
(2)请求头(Request Header)
请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
Accept:image/gif.image/jpeg./
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
(3)请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=Joke&password=1234
在以上的例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。
而python则可以使用下列2行代码实现一个简单的页面抓取:
url = 'http://www.vip.com/'
print urllib2.urlopen(url).read()
但是这样抓取的页面是杂乱无章的,所以,我们需要引入一些有趣的工具,例如”美丽的汤“BeautifulSoup,这碗汤可以使页面更加有序,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方说明中,Beautiful Soup会提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
这碗汤也是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
用户不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
来源:VSRC
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课