首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据分析师的编程之旅——Python爬虫篇(1)简单的小爬虫

作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师。

许久没有更新文章,最近深入在研究强化学习、迁移学习跟生成对抗网络,做了个小小的搜索引擎,一不小心就两个月左右没更新了。

前言不多说,直接进入主题。爬虫的内容很多,入门容易,深入难。

本文导读

首先爬虫是什么,为什么近几年有关爬虫的法律相继颁布?

网络爬虫,其实简单一点的说,就是拿计算机来自动获取往常需要人为复制的网络中的信息。

但也并不完全是如此。网络爬虫更为准确的定义应该为由计算机批量自动获取存在于、传输于网络中的数据流。那么数据流是什么?计算机网络又是什么?这部分知识其实在大学本科一年级或二年级时的大学计算机基础课程中均有涉及。有点久远了?那么我在本文里再来简单的介绍一下。

01

网络是什么?

计算机网络就是通过各种奇奇葩葩的协议,例如TCP/IP、FTP、HTTP(HTTPS)、SSH等等各种层面的协议,再通过光纤、网线将服务器、计算机连接起来的一张大网,使得计算机相互之间可以进行通信与传输。正因为在传输时为了保持数据的完整性、安全性等,所以才有各种奇奇葩葩的协议,那都是前人们的智慧。

对于现下来说,网络传输层最常用的一种就是TCP/IP协议,应用层最常用的就是HTTP(HTTPS)协议。HTTPS是加密版本的HTTP协议。例如我们使用的各种浏览器便是使用HTTP(HTTPS)协议。我们爬虫系列也主要针对以浏览器为请求发送器和接收器的数据获取方式,至于其他的“爬虫”,本系列不多做介绍。其实所谓黑客也就是通过各种网络传输进行系统的破解,思想和网络爬虫是一致的,只是黑客获取的是对方加密的数据,而网络爬虫是获取对方公开的数据。所以针对网络爬虫,切忌强行、暴力获取数据,否则就踏入了hacker的范畴,那就是违反了法律。

02

爬虫原理

回到网络爬虫的介绍,想要做到捕捉数据流,就需要了解网站和浏览器的工作原理。一个网站你可以想象成一个工厂,有接收器(进货口)和发送器(出货口),通过接收器接收由外部发送的请求(Request)来作出相应的加工并从发送器发送出响应(Response)。而这里的外部,我们通常是使用的浏览器,站在浏览器的角度来说,也有一个发送器和接收器,浏览器的发送器发送的为请求(Request),接收器接收的为对方网站服务器发送的响应(Response)。通过这样一个流程,使得我们在浏览器端可以向对方网站请求获取数据。

在发送请求和发送响应时,均会带着一个叫做头(Headers)的东西,这个东西中记录着发送方的信息,例如编码格式,目标地址(IP地址或域名)等等。请求的头信息一般来说会稍微多一点点,例如请求的方式(GET或POST),请求携带的参数,请求的来源(系统版本+浏览器内核类型和版本)等。这个头就像是一封介绍信,我们的浏览器拿着这封介绍信去到对方网站要货,对方网站收到后作出回应后也写一封响应信并把货带着信返回给我们的浏览器。

在之前介绍前端时有讲过如何查看以上内容,可能有些久远,这里再重新介绍一下,笔者使用Chrome浏览器更多,右键->检查->Network便可查看一个网页加载时的整个传输过程(如果直接打开没有内容,按F5刷新便可看到,网页都加载完了当然没有数据传输过程中的东西)

只要理解清楚以上流程,那么爬虫其实就简单了很多,使用几乎任何一门编程语言都有发送请求和接受响应的功能,例如R语言中的RCurl包就针对请求进行了比较好的封装,Java的net中HttpURLConnetion,Nodejs中的https模块,Python中的urllib模块、request模块等等都能实现。

本文主要针对Python3的urllib模块进行讲解(Python2的urllib和urllib2整合后成为了Python3中的urllib,拓展功能封装在urllib3中,Python3里没有urllib2)

其他的爬虫教程中,貌似针对获取网页源码(数据流中最多的一种)讲得并不是很深入,更多是在讲解如何进行网页的解析。但,网页的解析门槛较高,可成长曲线几乎是平稳的,学会了就基本不需要花更多的心思,而获取的过程就不一样,针对不同网站还有不同的获取方式,别人给不给还要看对方反爬虫的工程师偷没偷懒。想要深入爬虫,真正最困难的是获取数据这一步,换种说法来解释其实也很容易理解,获取数据的过程是你去求人给你东西,而解析源码是你自己拿着一堆沙子从中清洗出几个贝壳。

03

爬虫初试

之后直接上代码来展示一下,例如我们在csdn中搜索python爬虫关键词找到一篇文章,页面如下

调用urllib中request版块中的Request类,传入请求地址(URL)实例化请求对象,再通过调用urllib中request版块中的urlopen方法发送请求,返回结果为响应,再调用read方法读取响应文件中的字节流(此时的结果为byte,即字节类型),再解码为utf-8的编码,打印出的结果即为当前请求URL的网页源码。

爬虫中的第一步以上几行即可完成。这个过程非常简单就可以实现,但站在一个网站的角度,并不会轻易让人获取到他网页的内容,因为在当前这个时代,数据即是价值,相信大部分查看本文的读者还是希望学习到一种数据收集的方法。所以一般大型网站均有反爬虫工程师(其实不少是前端工程师,控制数据加载的过程即可控制外部数据流的获取)。

之前也讲过我们这一端在发送请求时会挈带一个头来标明自己的身份,但浏览器端在发送请求时这个过程是隐藏的,我们并不知道是怎么来携带头(其实在浏览器输入地址栏输入URL后按回车就是发送了一个GET请求)。现在我们是自己来写代码来发送请求,所以这个头的内容也是由我们来进行输入(为什么要携带头,因为反爬虫第一道坎是检查这个请求的来源,如果是非浏览器立即拒绝响应,无论哪种语言用最底层的发送请求方式都是标明自己是来自什么语言,例如python发送请求,默认的头中就标明自己是python,那你都承认自己是爬虫脚本程序,别人干嘛非得给你这个爬虫,你发送请求获取对方的数据可是会占用对方服务器的资源,没找你收电费都算好的了,当然排除一些丝毫没做反爬虫的网站)。

我们需要针对自己的爬虫程序进行一些伪装,至少伪装得像是人为浏览的一样。人为浏览通常都是在浏览器端进行的操作,所以我们需要在Headers文件中加入User-Agent这一项来标明自己是来源于浏览器(当然是伪装的),我的浏览器是使用Chrome,在上文中network任意找一个request请求,找到User-Agent这一项。具体实现如下,这次我们爬取百度网页中以python爬虫为关键词搜索的第一页(因为百度就检查user-agent)。

通过添加一句request.add_header()来添加头,传入两个参数,第一个参数为头选项,第二个参数为头选项对应的内容。当然也可以直接在建立请求对象时传入请求头的内容。传入的为字典,实现如下。

在之后讲到登录后进行的爬虫时会再详细讲请求头中的详细内容(会涉及到添加coockie等),当下仅需知道要设置上user-agent(用户代理),而且设置一次之后再写爬虫时可选用同一个浏览器的user-agent,复制粘贴即可。

在之后讲到获取ajax请求时会涉及到发送post请求(默认的request是发送的get请求),以及添加参数。首先要学会获取到源码,下一篇会讲解如何进行爬虫的解析,再之后除了解析JSON时需要再讲解一点解析的过程,剩下的讲解全为如何获取源码(数据)。

系列许久没有更新了,非常的抱歉,年终业务确实有些多,到春节前的这个期间,有时间都会进行更新,春节期间是否更新看到时候时间上的安排。人生苦短,我选python。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G1B69600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券