HTTP协议与R语言爬虫

核桃 201 0

为什么NBA中文官网迅速衰落了?

内容为王,但是那边貌似和门户一样。

粘性几乎木有,去虎扑得了。

NBA数据查询的中文网站是如何建立的?李博放又是谁?

这个网站从国外网站获取数据

对高阶数据进行计算

支持复杂的查询

对于NBA数据爱好者来说帮助极大

被百度贴吧虎扑等论文广泛引用

腾讯将成为“NBA中国数字媒体独家官方合作伙伴”

NBA与腾讯签署全新合作协议,腾讯将成为“NBA中国数字媒体独家官方合作伙伴”

- 此项合作是NBA史上最大规模的国际数字媒体合作–

- 双方还将就“NBA联盟通行证”和“NBA比赛时刻”应用程序等创新业务开展合作 -

北京时间,年1月30日 - 美国职业篮球协会(NBA)与腾讯(“Tencent”, HKSE: )共同宣布,双方已签署一项为期五年的合作伙伴协议,这将是NBA联盟历史上最大规模的国际数字媒体合作。双方新的合作将于年7月1日正式生效,作为全球领先的互联网综合服务提供商,届时腾讯将通过其多个平台,为球迷带来史无前例的NBA赛事直播以及NBA精彩内容。

作为“NBA中国数字媒体独家官方合作伙伴”,腾讯将会在包括PC、移动端等新媒体渠道,播出创纪录的全场直播、点播以及短视频等内容。腾讯将在未来每个赛季直播数百场高清NBA比赛。通过该合作协议,NBA将为腾讯用户提供主题节目,腾讯也将推出全新的NBA赛事直播及精品栏目,其中包括NBA季前赛、常规赛、全明星周末、季后赛、总决赛、夏季联赛以及NBA选秀等。NBA赛事及节目将通过腾讯网、腾讯视频、QQ和手机QQ、QQ空间、微信、腾讯新闻客户端、腾讯视频客户端等移动+PC终端平台播出。

NBA和腾讯还计划在中国合作推出“NBA联盟通行证(NBA League Pass)”服务。“NBA联盟通行证”是NBA广受球迷欢迎的赛事直播收费服务。通过联盟通行证,球迷可以跨屏欣赏任意一场NBA比赛的直播及集锦节目。

“在中国,NBA不仅是一项被广泛关注的运动,也代表了一种积极健康的生活方式,”腾讯总裁刘炽平(Martin Lau)表示。“这份为期数年的协议,将让我们可以持续为用户提供更多的NBA比赛和内容,这是过去不曾有过的。我们非常期待与NBA联盟、球队和球员共同努力,进一步提升这项运动的形象和受欢迎程度。”

“中国球迷非常热爱NBA并且对联盟了如指掌。我们非常高兴能够与腾讯拓展合作伙伴关系,”NBA主席亚当-萧华(Adam Silver)表示。“腾讯是中国最具创新能力和影响力的企业之一,通过腾讯丰富的媒体及互动平台,我们能够将最原汁原味的NBA体验带给更多中国球迷。”

“这项全新的合作将让亿万腾讯用户受益,”NBA中国首席执行官舒德伟(David Shoemaker)表示。“NBA在中国的受欢迎程度与日俱增,我们的球迷将通过包括腾讯网、微信、腾讯新闻和视频客户端在内的多个腾讯平台,不间断地享受和体验前所未有的NBA精彩节目、互动游戏、全新社区以及购物平台。”

NBA与腾讯将共同打造NBA中国的数字媒体平台,该平台包含NBA中文官网()、30支NBA球队的官方网站,以及NBA各项活动和授权产品的网站。此外,NBA与腾讯将推出“NBA比赛时刻(NBA GameTime)”移动端应用程序。通过“NBA比赛时刻”,球迷可以在移动设备上欣赏到NBA精彩片段、比赛新闻和数据。腾讯也将通过旗下的微信、QQ、QQ空间等社交媒体平台,全力支持NBA在社交媒体领域的进一步发展。

NBA与腾讯将共同建设“NBA社区”,订阅用户可在“NBA社区”体验和使用NBA游戏专区以及更全面的社交媒体电商平台等服务。双方将联手打造面向腾讯移动端用户的NBA主题互动游戏,同时腾讯还将在游戏平台上推广现有的NBA授权互动游戏。此外,NBA还将首次推出“NBA ID”会员系统,球迷可使用自己的NBA ID登陆社区,并通过使用NBA相关服务获得积分,以兑换更多NBA特别权益及授权产品。

关于 NBA

NBA是一个国际体育及媒体集团,由三个职业体育联盟组成:美国职业篮球联盟(NBA)、美国女子职业篮球联盟(WNBA)以及NBA发展联盟(NBADevelopment League)。NBA在世界13个城市设有办公室,NBA赛事通过47种语言在215个国家和地区播出,NBA的授权产品在六大洲超过100个国家和地区的超过12万5千个零售店有售。-15赛季,NBA共有101名来自于37个国家和地区的国际球员。NBA数字媒体平台包括向万美国家庭提供NBA信号的NBA TV,以及。-14赛季获得了创造纪录的269亿次点击,其中有超过半数来自北美以外的国家和地区。NBA是在社交媒体上最成功的职业体育联盟,联盟、球队以及球员在社交媒体平台拥有超过7.5亿个粉丝和点赞。通过NBA关怀行动,联盟、球队和球员共贡献了超过2.42亿美元的善款,完成了超过3百万小时的社区服务以及在世界各地建设了915处供青少年和他们的家庭生活和娱乐的场所。

关于腾讯

腾讯以技术丰富互联网用户的生活。每天,数以亿计的用户通过我们的整合平台线上沟通、分享经历、获取资讯和寻求娱乐。我们多元化的服务包括:即时通信工具 QQ、移动社交和通信服务微信/WeChat、社交网络平台QQ空间、腾讯游戏旗下QQ游戏平台、门户网站腾讯网(、腾讯新闻客户端和网络视频服务腾讯视频。

腾讯 年成立于中国深圳, 年在香港联交所主板上市,腾讯是50只香港恒生指数成份股之一。通过投资创新、为合作伙伴提供良好的环境和贴近用户的需求,我们致力与互联网共同发展。

HTTP协议与R语言爬虫

如果要使用R语言从网络抓取数据,就必须对R语言进行设置,使得R具备与服务器及Web服务进行通信的能力。而互联网中进行网络通信的通用语言就是HTTP(Hypter Text Transfer Protocol),即所谓超文本传输协议。

超文本协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是一个客户端终端(用户)和服务器终端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其他工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80),即可获取网络资源。即HTTP就是浏览器或者爬虫工具接收网页HTML的口令。

实际生活中,当我们坐在电脑前,用浏览器访问淘宝进行购物时,其间我们基本上不会与HTTP打交道。创建和发送HTTP请求,以及处理服务器端返回的HTTP响应都是由浏览器一手搞定,试想如果大家每次用淘宝购物都需要手动构建类似“用HTTP协议把网页下的某个商品链接传递给我”这样的请求,岂不是非常麻烦?R语言在爬取数据时正是模拟浏览器的行为。为了了解这个爬取过程,必须深入学习一下网络中文件传输协议并准确构建请求。

01

访问NBA中文网主页

图1 NBA中国官方网站

先来看在访问NBA中文网主页时浏览器是如何通过HTTP协议构建请求,以及服务器是如何响应请求的。首先,建立到的连接,并请求服务器发送index.html。HTTP客户端会把主机翻译为一个IP地址并在缺省的HTTP端口(80端口)建立到服务器的连接。比方说,这个80端口就好比网络资源服务器所在的屋子的门,HTTP客户端就是通过敲正门来建立起连接的,相应的请求和响应过程总结如图2所示。

图2 客户端会话信息

建立连接之后,服务器会等待请求,浏览器会向服务器发送如图3所示的HTTP请求。

图3 NBA中文网请求信息

然后就是服务器该如何响应浏览器的请求(见图4)。

图4 浏览器对于请求的响应

在接受了所有数据之后,连接会被浏览器再次关闭(Closing connection #0),一次访问就算结束了。

2

URL语法

所谓URL,就是平常所说的网址,全称为统一资源定位符(Uniform Resource Locators)。虽然URL不是HTTP的一部分,但通常能够通过URL直观地进行HTTP和其他协议的通信。总体的URL例子可以表示为:scheme://hostname:port/path?querystring#fragment。对应到NBA中文网的实例为:。

Scheme表示URL的模式,它定义了浏览器和服务器之间通信所采用的协议,NBA主页的例子中采用的模式就是HTTP。紧随其后的是主机名hostname和端口号port,主机名提供了存放我们感兴趣资源的服务器的名字,它是一个服务器的唯一识别符。端口号一般默认为80,主机名和端口号组合起来就等于说是告诉浏览器要去敲哪一扇门才能访问请求的资源。主机名和端口号之后的路径用来确定被请求的资源在服务器上的位置,跟文件系统类似,也是用“/”符号来分段的。

另外,在多数情形下,URL的路径里会提供很多补充信息,用来帮助服务器正确地处理一些复杂的请求,比如说通过类似“name=value”这样的查询字符串来获取更多的信息,或者用“#”符号来指向网页中特定的部分也是常见的补充方法。

最后需要说明的是,URL是通过ASCⅡ字符集来实现编码的,所有不在128个字符集里面的字符和特殊字符串都需要转义编码为标准的表示法,URL编码也被称为百分号编码,这是因为每个这样的编码都是以“%”开头的。在R语言中,可以通过基础函数URLencode()和URLdecode()函数来对字符串进行编码或者解码。

3

HTTP消息

网络爬虫需要掌握的另外一个知识点是HTTP消息。简单而言,HTTP消息就是与服务器通讯的“语言”,了解HTTP消息才能够用正确的“语言”与服务器交流,并获得反馈。一般而言,HTTP消息主要分为请求消息(即对服务器的请求)及响应消息(即服务器做出的反馈)。在数据爬取中,需要掌握的核心是请求消息。下面重点介绍HTTP消息中的请求消息,了解如何对服务器提出“要求”。

一般来说,HTTP消息一般由起始行(start line)、标头(headers)(也叫消息报头)和正文(body)三部分组成。以请求消息为例,起始行(每个HTTP消息的第一行)定义了请求使用的方法,以及所请求资源的路径和浏览器能够处理的HTTP最高版本。起始行之后的标头为浏览器和服务器提供了元信息,以“名字-取值”的形式表示一套标头字段。正文部分包含纯文本或者二进制数据,这由标头信息中的content-type声明决定。然后是MIME(多用途互联网邮件扩展)类型声明,这个声明的作用是告诉浏览器或服务器传输过来的是哪种类型的数据。起始行、标头和正文分开需要用到换行符(CRLF)。

图5 HTTP消息

在请求模式中,最常用的请求方法是GET和POST方法,在爬虫过程中至关重要。这两个方法都是从服务器请求一个资源,但是在正文的使用上有所不同。GET方法是网络请求最通用方法,可理解为直接请求。POST则有所区别,需要提交表单信息才能请求到信息,比如说拉勾网招聘首页需要用户输入地点、薪资范围等信息才能请求到匹配的网页界面。

GET请求如下:

GET/form.html HTTP/1.1(CRLF)

在R中,RCurl包提供了一些高级函数来执行GET请求从Web服务器上获取某个资源,最常用的函数为getForm(),这个函数会自动确定主机、端口以及请求的资源。实际操作中,只需要把URL传给这个函数,也可以手动指定HTML表单参数:

getForm(请求如下:

在R中执行POST请求,无需手动构建,而是可以使用postForm()函数:

在将预先声明的参数填充到表单中去的时候,需要注意利用style参数预先显式声明一下其可接受的方式。常见的HTTP请求方法如表1所示。

表1 常见的HTTP请求方法

浏览器发送请求后,服务器需要对其进行响应,会在响应的起始行发回一个状态码,可能大家会不太明白状态码是什么,比如经常见到的“404”(见图6),404就是一个表示服务器无法找到资源的响应状态码。

图6 404:NOT FOUND

而正常情形的响应状态码为200(见图7)。

图7 状态码200:请求成功

常见的HTTP状态码如下所示:

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

常见的200表示成功找到资源,404表示未找到资源,500表示服务器内部错误,502表示错误网关等。