不是广告,郑重声明
最近在研究文本挖掘相关的内容,所谓巧妇难为无米之炊,要想进行文本分析,首先得到有文本吧。获取文本的方式有很多,比如从网上下载现成的文本文档,或者通过第三方提供的API进行获取数据。但是有的时候我们想要的数据并不能直接获取,因为并不提供直接的下载渠道或者API供我们获取数据。那么这个时候该怎么办呢?有一种比较好的办法是通过网络爬虫,即编写计算机程序伪装成用户去获得想要的数据。利用计算机的高效,我们可以轻松快速地获取数据。
那么该如何写一个爬虫呢?有很多种语言都可以写爬虫,比如Java,php,python 等,我个人比较喜欢使用python。因为python不仅有着内置的功能强大的网络库,还有诸多优秀的第三方库,别人直接造好了轮子,我们直接拿过来用就可以了,这为写爬虫带来了极大的方便。不夸张地说,使用不到10行python代码其实就可以写一个小小的爬虫,而使用其他的语言可以要多写很多代码,简洁易懂正是python的巨大的优势。
好了废话不多说,进入今天的正题。最近几年网易云音乐火了起来,我自己就是网易云音乐的用户,用了几年了。以前用的是QQ音乐和酷狗,通过我自己的亲身经历来看,我觉得网易云音乐最优特色的就是其精准的歌曲推荐和独具特色的用户评论。经常一首歌曲下面会有一些被点赞众多的神评论。加上前些日子网易云音乐将精选用户评论搬上了地铁,网易云音乐的评论又火了一把。所以我想对网易云的评论进行分析,发现其中的规律,特别是分析一些热评具有什么共同的特点。带着这个目的,我开始了对网易云评论的抓取工作。
python内置了两个网络库urllib和urllib2,但是这两个库使用起来不是特别方便,所以在这里我们使用一个广受好评的第三方库requests。使用requests只用很少的几行代码就可以实现设置代理,模拟登陆等比较复杂的爬虫工作。如果已经安装pip的话,直接使用pip install requests 即可安装。。至于urllib和urllib2这两个库也是比较有用的,以后如果有机会我会再给大家介绍一下。
在正式开始介绍爬虫之前,首先来说一下爬虫的基本工作原理,我们知道我们打开浏览器访问某个网址本质上是向服务器发送了一定的请求,服务器在收到我们的请求之后,会根据我们的请求返回数据,然后通过浏览器将这些数据解析好,呈现在我们的面前。如果我们使用代码的话,就要跳过浏览器的这个步骤,直接向服务器发送一定的数据,然后再取回服务器返回的数据,提取出我们想要的信息。但是问题是,有的时候服务器需要对我们发送的请求进行校验,如果它认为我们的请求是非法的,就会不返回数据,或者返回错误的数据。所以为了避免发生这种情况,我们有的时候需要把程序伪装成一个正常的用户,以便顺利得到服务器的回应。如何伪装呢?这就要看用户通过浏览器访问一个网页与我们通过程序访问一个网页之间的区别。通常来说,我们通过浏览器访问一个网页,除了发送访问的url之外,还会给服务发送额外的信息,比如headers(头部信息)等,这就相当于是请求的身份证明,服务器看到了这些数据,就会知道我们是通过正常的浏览器访问的,就会乖乖地返回数据给我们了。所以我们程序就得像浏览器一样,在发送请求的时候,带上这些标志着我们身份的信息,这样就能顺利拿到数据。有的时候,我们必须在登录状态下才能得到一些数据,所以我们必须要模拟登录。本质上来说,通过浏览器登录就是post一些表单信息给服务器(包括用户名,密码等信息),服务器校验之后我们就可以顺利登录了,利用程序也是一样,浏览器post什么数据,我们原样发送就可以了。关于模拟登录,我后面会专门介绍一下。当然事情有的时候也不会这么顺利,因为有些网站设置了反爬措施,比如如果访问过快,有时候会被封ip(典型的比如豆瓣)。这个时候我们还得要设置代理服务器,即变更我们的ip地址,如果一个ip被封了,就换另外一个ip,具体怎么做,这些话题以后慢慢再说。
最后,再介绍一个我认为在写爬虫过程中非常有用的一个小技巧。如果你在使用火狐浏览器或者chrome的话,也许你会注意到有一个叫作开发者工具(chrome)或者web控制台(firefox)的地方。这个工具非常有用,因为利用它,我们可以清楚地看到在访问一个网站的过程中,浏览器到底发送了什么信息,服务器究竟返回了什么信息,这些信息是我们写爬虫的关键所在。下面你就会看到它的巨大用处。