【python爬虫】爬虫的基础知识

前言

很高兴能在这里遇见你,我将会带你学习网络爬虫。

学习爬虫需要你掌握一定的Python基础语法,而我相信,你已准备好,那就马上开始吧!
在这里插入图片描述

初识爬虫

什么是爬虫?

到底什么是爬虫呢?

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

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

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

以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。
在这里插入图片描述
点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。

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

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

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

为什么需要爬虫?

前面听我说了爬虫在个人生活、公司业务等方面能做的事,那都是别人“爬虫日常”的一角。现在我希望你稍稍停下来想一想,你最希望用爬虫做什么?有明确的目标么,还是正在摸索中?要知道,学海从不风平浪静,只有把自己的目标像灯塔一样立起来,才不易迷失。

希望你能重视自己的需求和目标,并且常常回顾,或许可以找一个你习惯的方式写出来,挂在哪里,电脑或日记本都好。当你疲惫或迷茫的时候拿出来看一下,这在情怀领域大概可以叫“不忘初心”。

总之,希望大家的学习之路能“靡不有初”且“靡不有终”。

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

明晰路径

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

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

浏览器的工作原理

首先从浏览器的工作讲起,这里主要讲chrome浏览器(因为chrome浏览器市场占用率最高,具有代表性)

现代浏览器都是多线程执行,由于进程是相互隔离的,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面。

在这里插入图片描述
下面我们来逐个分析下这几个进程的功能。

  • 浏览器进程。主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
  • 渲染进程。核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。

采用多进程架构的额外好处是可以使用安全沙箱,你可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面。Chrome
把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限。

  • GPU 进程。其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。
  • 网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。
  • 插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

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

更完整的交流过程是下图这样的:
在这里插入图片描述

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

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

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

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

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

爬虫的工作原理

其实,爬虫可以帮我们代劳这个过程的其中几步,请看下图:
在这里插入图片描述
当你决定去某个网页后,首先,爬虫可以模拟浏览器去向服务器发出请求;其次,等服务器响应后,爬虫程序还可以代替浏览器帮我们解析数据;接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;最后,爬虫可以批量地把数据存储到本地。这就是爬虫做的事。

其实,还可以把最开始的【请求——响应】封装为一个步骤——获取数据。由此,我们得出,爬虫的工作分为四步:
第0步:获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。

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

第2步:提取数据。爬虫程序再从中提取出我们需要的数据。

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

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

体验爬虫

这一部分的任务就是学会爬虫的第0步:获取数据。

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

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

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

先来看requests.get()方法。

requests.get()

requests.get()的具体用法如下,请仔细阅读注释噢:

# 引入requests库
import requests

# requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
# 我们把这个响应返回的结果赋值给变量res
res = requests.get('URL')

第2行代码,是引用requests库。

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

现在看一下requests.get()方法的参数——我们又看到了URL,也就是我们通常说的“网址”,在接下来的学习中,你也会发现,它几乎无处(课)不在,这是一个很基础却重要的内容,我们来一起学习或复习一下,学过的同学也不用担心回忆起被考试支配的恐惧,我们目前只需要看一眼去哪里找到它,不需要记得它大名叫统一资源定位符以及其它……

任意一个网页,在浏览器最顶部的地址栏双击一下鼠标,显示出的全部内容就是URL了。

URL的功能从它的常用别名“网址”以及它所在的位置“地址栏”联想一下就很好理解了:它指示了一个网页在网络上的地址,就像我们住的房子在地球上的详细到某某街道某某号的具体地址。

再啰嗦一句,已知URL(网址),想打开网页的时候,只要把整个URL粘贴到浏览器地址栏,按个回车就可以了。

如果用图片展示requests.get()的工作过程,那就是这样的:
在这里插入图片描述
现在,我们试着用requests.get()来下载一个小说——《三国演义》:
在这里插入图片描述
为了方便学习,直接把小说的URL(网址)给你用:

小说的URL(网址)是:https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md

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

# 引入requests库
import requests 

# 发送请求,并把响应结果赋值在变量res上
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md') 

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

继续往下走:

Response对象的常用属性

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

所以,我们现在来打印看看刚刚用requests.get()获取到的数据是什么,请运行下面的程序:

import requests 

res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png') 
# 打印变量res的数据类型
print(type(res))

运行结果:

<class 'requests.models.Response'>

终端显示:

这代表着:res是一个对象,属于requests.models.Response类。好,既然已经知道res是一个Response对象了,我们也就可以去了解它的相应属性和方法了。

我们主要讲Response对象常用的四个属性:
在这里插入图片描述
首先是response.status_code,直接看用法。在看完代码后,请运行。

import requests 

res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png') 
# 打印变量res的响应状态码,以检查请求是否成功
print(res.status_code)

运行结果:

200

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

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

在这里插入图片描述
接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。

假如我们想下载这张图片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png

那么代码可以这样写:

# 引入requests库
import requests

# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic = res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('ppt.jpg','wb')
# 获取pic的二进制内容
photo.write(pic) 
# 关闭文件
photo.close()


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

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

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

代码如下:

# 引用requests库
import requests

# 下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel=res.text
# 现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。
print(novel[:800])

请你自己写一遍上面的代码,并点击运行。

之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。

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

我们仍然以三国演义的小说来做示范,请看下面的代码(第7行为新增代码),然后运行:

# 引用requests库
import requests

# 下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 定义Reponse对象的编码为utf-8。
res.encoding='utf-8'
# 把Response对象的内容以字符串的形式返回
novel=res.text
# 打印小说的前800个字。
print(novel[:800])

运行结果:

## 三国演义

作者:罗贯中

### 第一回 宴桃园豪杰三结义 斩黄巾英雄首立功

> 滚滚长江东逝水,浪花淘尽英雄。
> 是非成败转头空。
> 青山依旧在,几度夕阳红。  
> 白发渔樵江渚上,惯看秋月春风。
> 一壶浊酒喜相逢。
> 古今多少事,都付笑谈中。
>           ——调寄《临江仙》

话说天下大势,分久必合,合久必分。周末七国分争,并入于秦。及秦灭之后,楚、汉分争,又并入于汉。汉朝自高祖斩白蛇而起义,一统天下,后来光武中兴,传至献帝,遂分为三国。推其致乱之由,殆始于桓、灵二帝。桓帝禁锢善类,崇信宦官。及桓帝崩,灵帝即位,大将军窦武、太傅陈蕃共相辅佐。时有宦官曹节等弄权,窦武、陈蕃谋诛之,机事不密,反为所害,中涓自此愈横。

建宁二年四月望日,帝御温德殿。方升座,殿角狂风骤起。åª见一条大青蛇,从梁上飞将下来,蟠于椅上。帝惊倒,左右急救入宫,百官俱奔避。须臾,蛇不见了。忽然大雷大雨,加以冰雹,落到半夜方止,坏却房屋无数。建宁四年二月,洛阳地震;又海水泛溢,沿海居民,尽被大浪卷入海中。光和元年,雌鸡化雄。六月朔,黑气十余丈,飞入温德殿中。秋七月,有虹现于玉堂;五原山岸,尽皆崩裂。种种不祥,非止一端。帝下诏问群臣以灾异之由,议郎蔡邕上疏,以为蜺堕鸡化,乃妇寺干政之所致,言颇切直。帝览奏叹息,因起更衣。曹节在后窃视,悉宣告左右;遂以他事陷邕于罪,放归田里。后张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人朋比为奸,号为“十常侍”。帝尊信张让,呼为“阿父”。朝政日非,以致天下人心思乱,盗贼蜂起。

时巨鹿郡有兄弟三人,一名张角,一名张宝,一名张梁。那张角本是个不第秀才,因入山采药,遇一老人,碧眼童颜,手执藜杖,唤角至一洞中,以天书三卷授之,曰:“此名《太平要术》,汝得之,当代天宣化,普救世人;若萌异心,必获恶

这只是个示范,是为了让大家理解res.encoding的意义,也就是它能定义Response对象的编码类型。

那在真实的情况中,我们该在什么时候用res.encoding呢?

首先,目标数据本身的编码方式是未知的。用requests.get()发送请求后,我们会取得一个Response对象,其中,requests库会对数据的编码类型做出自己的判断。但是!这个判断有可能准确,也可能不准确。比如你发给我一张“法语”字条,我看不出来是什么语言,猜测可能是“俄语”,“德语”等。

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

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

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

如果用一张图来总结,那就是这样的:
在这里插入图片描述
可以看到,爬虫的第0步:获取数据,本质就是通过URL去向服务器发出请求,服务器再把相关内容封装成一个Response对象返回给我们,这是通过requests.get()实现的,而我们获取到的Response对象下有四个常用的属性。

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

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

在这里给大家分享一些免费的课程供大家学习,下面是课程里面的截图,扫描最下方的二维码就能全部领取,
如果图片失效点击蓝色字体便可跳转哦~点这里哦

1.Python所有方向的学习路线

在这里插入图片描述

2.学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
在这里插入图片描述

3.学习资料

在这里插入图片描述

4.实战资料

实践是检验真理的唯一标准。这里的压缩包可以让你再闲暇之余帮你提升你的个人能力。
在这里插入图片描述

5.视频课程

在这里插入图片描述

好啦今天的分享就到这里结束了,快乐的时光总是短暂呢,想学习更多课程的小伙伴不要着急,有更多惊喜哦~在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值