当前页面: 首页 > SEO优化 > SEO培训 >

【Python爬虫】初识爬虫、工作原理、体验爬虫

2020-12-22 11:03:37

  学习爬虫需要你掌握一定的Python基础语法,而我相信,你已经准备好了,那就马上开始吧!

  一、初识爬虫

  到底什么是爬虫呢?

  爬虫,从本质上讲,就是利用程序在网上拿到对我们有价值的数据。

  爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。这是个人利用爬虫能做到的事情。

  而公司,同样可以利用爬虫来实现巨大的商业价值。比如你熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。

  以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。

【Python爬虫】初识爬虫、工作原理、体验爬虫

  点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个百度快照页面属于百度。

【Python爬虫】初识爬虫、工作原理、体验爬虫

  这是因为,百度这家公司会源源不断地将千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其他网站了。

  爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。

  从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。

  现在,我们对爬虫有了初步的印象,知道了爬虫能做什么,那我们接下来看看,爬虫是如何做到这些事情的。

  二、明晰路径

  一般来说,传统的拿数据的做法是:通过浏览器上网→手动下载所需要的数据。其实在这背后,浏览器做了很多我们看不见的工作,而只有了解浏览器工作原理后,才能真正理解爬虫在帮我们做什么。

  所以,我们先来看看浏览器的工作原理。

  浏览器的工作原理

  我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。(这是我们自己搭建的网站,方便教学和实操)。

【Python爬虫】初识爬虫、工作原理、体验爬虫

  在这个网站上有几篇文章。假设,我们想收藏首页的文章标题和文章摘要,我们可能会复制粘贴到本地文档。

  其实这个过程,是一个人和浏览器交流的过程,请看下图:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  实不相瞒,在这个过程中,浏览器的交流对象不只有你,还有【服务器】。我们可以把服务器理解为一个超级电脑,它可以计算和存储大量数据,并且在互联网中互相传输数据。

  更完整的交流过程是下图这样的:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  首先,我们在浏览器输入网址(也可以叫作URL)。然后,浏览器会向服务器传达我们想访问某个网页的需求,这个过程就叫做【请求】。

  紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。

  所以浏览器和服务器之间,先请求,后响应,有这么一层关系。

【Python爬虫】初识爬虫、工作原理、体验爬虫

  好,继续看:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成你能看懂的样子,这是浏览器的另一项工作【数据解析】。

  紧接着,我们就可以在拿到的数据中,挑选出对我们有用的数据,这是【数据提取】。

  最后,我们把这些有用的数据保存好,这是【数据存储】。

  以上,就是浏览器的工作原理,是人、浏览器、服务器三者之间的交流过程。

  可这和爬虫有什么关系呢?

  其实,爬虫可以帮我们代劳这个过程的其中几步,请看下图:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  当你决定去某个网页后,首先,爬虫可以模拟浏览器去向服务器发出请求;其次,等服务器响应后,爬虫程序还可以替代浏览器帮我们解析数据;接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们手动去提取;最后,爬虫可以批量地将数据存储到本地。

  这就是爬虫做的事。简化上图,就是爬虫的工作原理了:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  其实,还可以吧最开始的【请求——响应】封装成一个步骤——获取数据。由此,我们得出,爬虫的工作分为4步:

  ①获取数据。爬虫会根据我们提供的网址,向服务器发起请求,然后返回数据。

  ②解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。

  ③提取数据。爬虫程序再从中提取我们需要的数据。

  ④存储数据。储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。

  这就是爬虫的工作原理啦,无论以后的学习内容怎么变化,其核心都是爬虫原理。

  三、体验爬虫

  我们将来学习爬虫的第0步:获取数据

  我们将利用一个强大的库——requests来获取数据。

  如果你希望在电脑上安装,方法是:在Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击enter即可;Windows电脑里叫命令提示符(cmd),输入pip install requests即可。

  requests库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。

  先来看requests.get()方法。

  requests.get()

  request.get()具体用法如下,请仔细阅读注释哦~

  import requests

  #引入requests库

  res = requests.get('URL')

  #requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。

  #我们把这个响应返回的结果赋值在变量res上。

  第一行,是引用requests库。

  第三行,requests.get()发送了请求,然后得到了服务器的响应。服务器返回的结果是个response对象,现在存储到了我们定义的变量res中。

  如果用图片展示,就是这样的:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  现在我们试着用requests.get()来下载一个小说——《三国演义》:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  那么根据所学,代码应该是这样的:

  import requests

  #引入requests库

  res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')

  #发送请求,并把响应结果赋值在变量res上

  这就是基本的requests.get()的用法了。

  Response对象的常用属性

  Python是一门面向对象的编程语言,而在爬虫中,理解数据是什么对象是极其重要的事情。因为只有知道了数据是什么对象,我们才知道对象有什么属性和方法供我们操作。

  我们主要讲Response对象常用的四个属性:

  ①属性:response.status_code 作用:检查请求是否成功

  ②属性:response.content 作用:把response对象转换为二进制数据

  ③属性:response.text 作用:把response对象转换为字符串数据

  ④属性:response.encoding 作用:定义response对象的编码

  首先是response.status_code,直接看用法:

  import requests

  res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')

  print(res.status_code)

  #打印变量res的响应状态码,以检查请求是否成功

  第3行代码是在打印res的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200,这个数字代表服务器同意了请求,并返回了数据给我们。

  除了200,我们还能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表了什么,但不需要记住它们,在遇到的时候查询就好。

【Python爬虫】初识爬虫、工作原理、体验爬虫

  其次是response.content,一个很常见的属性,在我们之后的爬虫代码中也将多次出现。它能把response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。

  假如我们要下载一张图片,它的URL是https://www.asiaseo.net/uploads/allimg/201221/9999-2012211353155W.png

  那么代码可以这样写:

  import requests

  res = requests.get('https://www.asiaseo.net/uploads/allimg/201221/9999-2012211353155W.png')

  #发出请求,并把返回的结果放在变量res中

  pic=res.content

  #把Reponse对象的内容以二进制数据的形式返回

  photo = open('ppt.jpg','wb')

  #新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。

  #图片内容需要以二进制wb读写。你在学习open()函数时接触过它。

  photo.write(pic)

  #获取pic的二进制内容

  photo.close()

  #关闭文件

  这样,我们的图片就下载成功啦~你也可以本地运行这个程序。

  讲完了response.content,继续看response.text,这个属性可以把response对象的内容以字符串的形式返回,适用于文字、网页源码的下载。

  举个例子,我们来下载小说《三国演义》的第一章。

  代码如下:

  import requests

  #引用requests库

  res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')

  #下载《三国演义》第一回,我们得到一个对象,它被命名为res

  novel=res.text

  #把Response对象的内容以字符串的形式返回

  print(novel[:800])

  #现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。

  接下来,我们看最后一个属性:response.encoding,它能帮我们定义Response对象的编码。

  import requests

  #引用requests库

  res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')

  #下载《三国演义》第一回,我们得到一个对象,它被命名为res

  res.encoding='utf-8'

  #定义Reponse对象的编码为utf-8。

  novel=res.text

  #把Response对象的内容以字符串的形式返回

  print(novel[:800])

  #打印小说的前800个字。

  这只是一个示范,res.encoding能定义Response对象的编码类型。那么在真实情况中,我们该什么时候用res.encoding呢?

  首先,目标数据本身是什么编码是未知的。用requests.get()发送请求后,我们会取得一个Response对象,其中,requests库会对数据的编码类型做出自己的判断。但是!这个判断有可能准确,也可能不准确。

  如果它判断准确的话,我们打印出来的response.text内容就是正常的、没有乱码的,那就用不到res.encoding;如果判断不准确,就会出现一堆乱码,那么我们就可以去查目标数据的编码,然后再用res.encoding把编码定义成和目标数据一致的类型即可。

  总的来说,就是遇到文本的乱码问题,才考虑用res.encoding。

  好,到这里,requests.get()方法和Response对象常用的四个属性就讲完了。

  如果用一张图来总结,那就是这样的:

【Python爬虫】初识爬虫、工作原理、体验爬虫

  可以看到,爬虫第0步:获取数据,本质就是通过URL去向服务器发出请求,服务器再把相关内容封装成一个Response对象返回给我们,这是通过requests.get()实现的,而我们获取到的Response对象下有个常用的属性。

  同学们要注意这种从URL到Response这种操作对象的转换关系。

  好啦,你已经知道怎么用requests库来获取数据了,爬虫的第0步你就搞定了。

 

python爬虫爬虫

用户评价:【Python爬虫】初识爬虫、工作原理、体验爬虫

同类文章



seo