4.25(第一天)
**
**
1、初始爬虫
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
2、明晰路径
2-1、浏览器工作原理
(1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;
(2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;
(3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。
2-2、爬虫工作原理
(1)获取数据:爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据;
(2)解析数据:爬虫程序会把服务器返回的数据解析成我们能读懂的格式;
(3)提取数据:爬虫程序再从中提取出我们需要的数据;
(4)储存数据:爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
3、体验爬虫
3-1、requests.get()
①、安装 requests 库
Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击 enter;
Windows电脑里叫命令提示符(cmd),输入pip install requests 。
提示:往后安装其他库时与上方类似,pip install 模块名
②、requests 库作用
requests 库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
③、requests 库使用
选择语言
res = requests.get(‘URL’)
requests.get 是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。我们把这个响应返回的结果赋值在变量res上。
3-2、Response对象的常用属性
①、response.status_code
打印 response 的响应状态码,以检查请求是否成功。
②、response.content
把 Response 对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载。
③、response.text
把 Response 对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
④、response.encoding
能帮我们定义Response对象的编码。(遇上文本的乱码问题,才考虑用res.encoding)
3-3、汇总图解
4、爬虫伦理
4-1、Robots 协议
Robots 协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
4-2、协议查看
(1)在网站的域名后加上/robots.txt就可以了。如淘宝的robots协议 ( http://www.taobao.com/robots.txt);
(2)协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。
目录
1、初始爬虫
2、明晰路径
2-1、浏览器工作原理
2-2、爬虫工作原理
3、体验爬虫
3-1、requests.get()
3-2、Response对象的常用属性
3-3、汇总图解
4、爬虫伦理
4-1、Robots 协议
4-2、协议查看
程中我们的示范,会用谷歌浏览器(Chrome)进行演示,强烈推荐你也使用它。
如果你还没有谷歌浏览器(Chrome),打开下面的链接,就可以下载Chrome的安装包了,Windows和Mac都有:谷歌浏览器(Chrome)安装教程(https://www.google.cn/intl/zh-CN/chrome/)
初识爬虫
什么是爬虫?
到底什么是爬虫呢?
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。
爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?深圳的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。
这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
以百度为例,你在搜索的时候仔细看,会发现每个搜索结果下面都有一个百度快照。
点击百度快照,你会发现网址的开头有baidu这个词,也就是说这个网页属于百度。
这是因为,百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。你在百度搜索的本质就是在它的服务器上搜索信息,你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了。
爬虫还让这些搜索巨头有机会朝着人工智能的未来迈进,因为人工智能的发展离不开海量的数据。而每天使用这些搜索网站的用户都是数以亿计的,产生的数据自然也是难以计量的。
从搜索巨头到人工智能巨头,这是一条波澜壮阔的路。而我们应该看到,事情的源头,却是我们今日所书写的“爬虫”。
我们会通过一个网站:人人都是蜘蛛侠 来学习浏览器的工作原理。(这是我们自己搭建的网站,方便教学和实操)
首先,我们在浏览器的地址栏输入网址(也可以叫URL)。然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。
紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。
所以浏览器和服务器之间,先请求,后响应,有这么一层关系。
第0关,初识爬虫,你会了解爬虫的工作原理,写出一个简单的爬虫程序,学会爬虫的第0步:获取数据。
icon
第1关,你将会快速入门HTML基础知识,达到读懂和修改HTML文档的水平。有了这些基础,你才能去学习如何解析数据和提取数据。
icon
第2、3、4、5关,我会教你爬虫的第1和第2步:解析数据和提取数据。同时,你还会学到两种不同的发起请求的方式。
icon
在第6关,你将学会存储数据,即把目标数据写入到本地的Excel表格中。到此,你就学会了爬虫完整的四个步骤,掌握了最基本的爬虫技能啦。
icon
第7关,我们一起做一个项目,爬取一个知乎大v的所有文章,并且存到Excel中。以此,我们巩固和复习了0-6关的所有知识。第7关会是一个分水岭,后面关卡的进阶知识都建立在前7关的基础上。
icon
第8关,学会cookies,就可以让浏览器记住你,你们可以更方便地长期保持联系,而不是在一次见面之后就相忘于江湖。
icon
第9关,学习控制浏览器,来应对爬虫中一些更复杂的情况。第10关,你的爬虫会变得更自动化,爬虫程序不但可以定时工作,还可以把爬取结果传递给你。
icon
接下来的4关,你将学会更高效更强大的爬虫方法,让爬虫技能升级。
icon
第15关毕业总结,就到了告别的时刻了。这时你也学成出师,可以用爬虫知识去做自己想做的事情了,让爬虫为你消灭重复劳动,高效获取信息,创造出更多价值。
icon
以上,就是爬虫学习大纲。
# 引入requests库
import requests
# requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
# 我们把这个响应返回的结果赋值给变量res
res = requests.get('URL')
现在,我们试着用requests.get()来下载一个小说——《三国演义》:
# 来吧,写代码吧
import requests
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md'
response = requests.get(url)
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 打印变量res的响应状态码,以检查请求是否成功
print(res.status_code)
icon
第5行代码是在打印res的响应状态码,它可以用来检查我们的requests请求是否得到了成功的响应。我们看到终端结果显示了200,这个数字代表服务器同意了请求,并返回了数据给我们。
icon
除了200,我们还可能收到其他的状态码。下面有一个表格,供你参考不同的状态码代表什么,但不需要记住它们,在遇到问题的时候查询就好。
icon
response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。
icon
接着的属性是response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。
icon
假如我们想下载这张图片,它的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()
icon
这样,我们的图片就下载成功啦~你也可以在本地运行这个程序。
icon
讲完了response.content,继续看response.text,这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
icon
举个例子,我们还是来下载小说《三国演义》的第一回。
# 引用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])
icon
之后,我们就可以用通过读写文件把小说保存到本地了。这是Python基础语法知识,你应该已经学会了。下面直接给出做法,你也可以在自己的本地电脑上做尝试练习。
# 引入requests库
import requests
#下载《三国演义》第一回,我们得到一个对象,它被命名为res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response对象的内容以字符串的形式返回
novel = res.text
# 创建一个名为《三国演义》的txt文档,指针放在文件末尾,追加内容
k = open('《三国演义》.txt','a+')
# 写进文件中
k.write(novel)
# 关闭文档
k.close()
爬虫伦理
icon
就像是两个人在来来往往的相处中,会考虑对方的感受;在互联网的世界中,我们也要考虑一下服务器对爬虫的感受是怎样的。
icon
我们说过,服务器其实就是一个超级电脑,拥有这个服务器的公司,对爬虫其实也有明确的态度。
icon
通常情况下,服务器不太会在意小爬虫,但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害。
icon
不过,服务器在通常情况下,对搜索引擎是欢迎的态度(刚刚讲过,谷歌和百度的核心技术之一就是爬虫)。当然,这是有条件的,通常这些条件会写在robots协议里。
icon
robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
icon
我们使用robots协议的场景通常是:看到想获取的内容后,检查一下网站是否允许爬取。因此我们只需要能找到、简单读懂robots协议就足够了。
icon
我们截取了一部分淘宝的robots协议,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
icon
有的同学可能就要问了:“域名是什么?域名和URL(网址)有什么关系?”很敏锐哟!
icon
我们前面说过,如果把一个网页类比为一幢房子,URL指示了网页的地址,就像房子在地球上的详细到某某街道某某号的具体地址,那么域名就像房子所在的国家,指示了网站的地址。
icon
如果我们看到一个网页,想爬上面的内容,怎么找到它的URL我们刚刚学过了,如果网页的URL是https://pypi.org/project/requests/,那么,此网站的域名是pypi.org;如果网页的URL是http://cn.python-requests.org/zh_CN/latest/,那么网站的域名是cn.python-requests.org。
icon
我们再来看一个,如果网页的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS,那么网站的域名是www.taobao.com。
单选题
看懂了么?我们来试一次,某网页的网址是https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1,那么网站的域名是?
答对了!
icon
没错,你已经找到了规律!
icon
有个课后思考交给你:域名中会藏着网站的国籍或功能领域等信息,那么.cn,.com,.gov结尾的域名分别代表了什么?
icon
来看一个实例:我们截取了一部分淘宝的robots协议 (
http://www.taobao.com/robots.txt)。在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
User-agent: Baiduspider # 百度爬虫
Allow: /article # 允许访问 article
Allow: /oshtml # 允许访问 oshtml
Allow: /ershou # 允许访问 ershou
Allow: /$ # 允许访问根目录,即淘宝主页
Disallow: /product/ # 禁止访问product文件夹下面的所有文件,但是product文件夹本身允许被访问
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
User-Agent: Googlebot # 谷歌爬虫
Allow: /article
Allow: /oshtml
Allow: /product # 允许访问product文件夹及product文件夹下面的所有文件
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: / # 禁止访问除 Allow 规定页面之外的其他所有页面
…… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接
User-Agent: * # 其他爬虫
Disallow: / # 禁止访问所有页面
icon
可以看出robots协议是“分段”的吗?每个段落都含有以下两种字段:一种是User-agent:,另一种是Allow:或Disallow:。
icon
User-agent表示的是爬虫类型,上面的示例代码注释了“百度爬虫”和“谷歌爬虫”,我们自己写的爬虫一般要看User-Agent: *,*指向所有未被明确提及的爬虫。
icon
Allow代表允许被访问,Disallow代表禁止被访问。字段对应的值都含有路径分隔符/,限制了哪些或哪一层目录的内容是允许或者禁止被访问的。可以对比上述百度爬虫Disallow: /product/和谷歌爬虫Allow: /product的注释行理解一下。
要求:
获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
目的:
练习获取网上的文本文件。
题目要求:获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
获取数据:
文本URL:
https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md
首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储数据:
存储文件的三个步骤:打开文件,存储文件,关闭文件。
import requests
destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'
res = requests.get (destnation_url)
print(res.status_code) # 查看响应码
article=res.text # 把Response对象的内容以字符串的形式返回
print(article)
返回结果如下
# HTTP响应状态码
## 1xx:临时响应
#### 表示临时响应并需要请求者继续执行操作的状态代码。
100 **继续**请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 **切换协议**请求者已要求服务器切换协议,服务器已确认并准备切换。
---
## 2xx : 成功
#### 表示成功处理了请求的状态代码。
200 **成功** 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
201 **已创建** 请求成功并且服务器创建了新的资源。
202 **已接受** 服务器已接受请求,但尚未处理。
203 **非授权信息** 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 **无内容** 服务器成功处理了请求,但没有返回任何内容。
205 **重置内容**服务器成功处理了请求,但没有返回 任何内容。
206 **部分内容** 服å¡器成功处理了部分 GET 请求。
---
## 3xx : 重定向
#### 表示要完成请求,需要进一步操作。通常,以下状态代码用来重定向。
300 **多种选择** 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 **永久移动** 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 **临时移动** 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 **查看其他位置**请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 **未修改**自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305 **使用代理**请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307 **临时重定向** 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
---
## 4xx:请求错误
### 以下状态代码表示请求可能出错,妨碍了服务器的处理。
400 **错误请求**服务器不理解请求的语法。
401 **未授权**请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
403 **禁止**服务器拒绝请求。
404 **未找到**服务器找不到请求的网页。
405 **方法禁用**禁用请求中指定的方法。
406 **不接受**无法使用请求的内容特性响应请求的网页。
407 **需要代理授权**此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 **请求超时** 服务器等候请求时发生超时。
409 **冲突** 服务器在完成请求时发生冲突。服务器必须在响应中包含有关å²突的信息。
410 **已删除** 如果请求的资源已永久删除,服务器就会返回此响应。
411 **需要有效长度**服务器不接受不含有效内容长度标头字段的请求。
412 **未满足前提条件**服务器未满足请求者在请求中设置的其中一个前提条件。
413 **请求实体过大**服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 **请求的 URI 过长**请求的 URI(通常为网址)过长,服务器无法处理。
415 **不支持的媒体类型**请求的格式不受请求页面的支持。
416 **请求范围不符合要求**如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 **未满足期望值**服务器未满足"期望"请求标头字段的要求。
---
## 5xx:服务器错误
### 以下状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500 **服务器内部错误** 服务器遇到错误,无法完成请求。
501 **尚未实施**服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 **错误网关**服务器作为网关或代理,从上游服务器收到无效响应。
503 **服务不可用**服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 **网关超时** 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 **HTTP 版本不受支持**服务器不支持请求中所用的 HTTP 协议版本。
练习介绍
要求:
获取下面的图片,并且储存图片。
目的:
练习获取网上的图片文件。
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')
# 把Reponse对象的内容以二进制数据的形式返回
pic=res.content
# 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo = open('spider.jpg','wb')
# 获取pic的二进制内容
photo.write(pic)
# 关闭文件
photo.close()
练习介绍
题目要求:
获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:
https://static.pandateacher.com/Over%20The%20Rainbow.mp3
获取数据
音乐URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3
首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
然后需要把Response对象用合适的数据形式返回。
存储文件
存储文件的三个步骤:打开文件,存储文件,关闭文件。
import requests
# 发出请求,并把返回的结果放在变量res中
res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')
# 把Reponse对象的内容以二进制数据的形式返回
mp3 = res.content
# 新建了一个文件rainbow.mp3,这里的文件没加路径,它会被保存在程序运行的当前目录下。
# 音频内容需要以二进制wb读写。你在学习open()函数时接触过它。
music = open('rainbow.mp3','wb')
# 写入mp3的二进制内容
music.write(mp3)
# 关闭文件
music.close()