什么是爬虫?
从本质上来说,就是利用程序在网上拿到对我们有价值的数据
爬虫能做很多事,能做商业分析,也能做生活助手,
比如:分析北京近两年二手房成交均价是多少?
深圳的Python工程师平均薪资是多少?
北京哪家餐厅粤菜最好吃?等等。
这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。
比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。
百度这家公司会源源不断地把千千万万个网站爬取下来,存储在自己的服务器上。
你在百度搜索的本质就是在它的服务器上搜索信息,
你搜索到的结果是一些超链接,在超链接跳转之后你就可以访问其它网站了
浏览器工作原理
当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。
因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成你能看得懂的样子,
这是浏览器做的另一项工作【解析数据】。
爬虫的工作原理
获取数据
我们将会利用一个强大的库——
requests
来获取数据。安装requests
pip install requests
requests
库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
requests.get()
import requests
#引入requests库
res = requests.get('URL')
#requests.get是在调用requests库中的get()方法,它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
#我们把这个响应返回的结果赋值在变量res上。
复制代码
尝试下载三国演义...
localprod.pandateacher.com/python-manu…
import requests
#引入requests库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
#发送请求,并把响应结果赋值在变量res上
print(res)
print(type(res))
复制代码
Response对象的常用属性
在爬虫中,理解数据是什么对象是非常、特别、以及极其重要的一件事。
因为只有知道了数据是什么对象,我们才知道对象有什么属性和方法可供我们操作
res是一个对象,属于
requests.models.Response
类
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
print(res.status_code)
#打印变量res的响应状态码,以检查请求是否成功
复制代码
- 301—永久移动。被请求的资源已被永久移动位置;
- 302—请求的资源现在临时从不同的 URI 响应请求;
- 305—使用代理。被请求的资源必须通过指定的代理才能被访问;
- 307—临时跳转。被请求的资源在临时从不同的URL响应请求;
- 400—错误请求;
- 402—需要付款。该状态码是为了将来可能的需求而预留的,用于一些数字货币或者是微支付;
- 403—禁止访问。服务器已经理解请求,但是拒绝执行它;
- 404—找不到对象。请求失败,资源不存在;
- 406—不可接受的。请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体;
- 408—请求超时;
- 409—冲突。由于和被请求的资源的当前状态之间存在冲突,请求无法完成;
- 410—遗失的。被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址;
- 413—响应实体太大。服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值。
- 417—期望失败。在请求头 Expect 中指定的预期内容无法被服务器满足;
- 418—我是一个茶壶。超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现;
- 420—方法失效。
- 422—不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应;
- 500—服务器内部错误。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理;
接着的属性是
response.content
,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载
import requests
res = requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1559093899057&di=f87221caaa1719bf8a99623f18ee9866&imgtype=0&src=http%3A%2F%2Fk.zol-img.com.cn%2Fsjbbs%2F7692%2Fa7691515_s.jpg')
#发出请求,并把返回的结果放在变量res中
pic=res.content
#把Reponse对象的内容以二进制数据的形式返回
photo = open('ppt.jpg','wb')
#新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
#图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
photo.write(pic)
#获取pic的二进制内容
photo.close()
#关闭文件
复制代码
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='gbk'
#定义Response对象的编码为gbk
novel=res.text
#把Response对象的内容以字符串的形式返回
print(novel[:800])
#打印小说的前800个字
复制代码
我们打印出来的
response.text
的内容就是正常的、没有乱码的,那就用不到res.encoding
;如果乱码,去查看目标数据的编码,再用
res.encoding
把编码定义成和目标数据一致的类型即可。
爬虫伦理
通常情况下,服务器不太会在意小爬虫,
但是,服务器会拒绝频率很高的大型爬虫和恶意爬虫,因为这会给服务器带来极大的压力或伤害
服务器在通常情况下,对搜索引擎是欢迎的态度(谷歌和百度的核心技术之一就是爬虫)。
当然,这是有条件的,而这些条件会写在
Robots
协议。
Robots
协议是互联网爬虫的一项公认的道德规范,全称是“网络爬虫排除标准”(Robots exclusion protocol),
这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
如何查看网站的robots协议呢,很简单,在网站的域名后加上
/robots.txt
就可以了。淘宝的robots协议 ( www.taobao.com/robots.txt)。
在截取的部分,可以看到淘宝对百度和谷歌这两个爬虫的访问规定,以及对其它爬虫的规定。
User-agent: Baiduspider #百度爬虫
Allow: /article #允许访问 /article.htm
Allow: /oshtml #允许访问 /oshtml.htm
Allow: /ershou #允许访问 /ershou.htm
Allow: /$ #允许访问根目录,即淘宝主页
Disallow: /product/ #禁止访问/product/
Disallow: / #禁止访问除 Allow 规定页面之外的其他所有页面
User-Agent: Googlebot #谷歌爬虫
Allow: /article
Allow: /oshtml
Allow: /product #允许访问/product/
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: / #禁止访问除 Allow 规定页面之外的其他所有页面
…… # 文件太长,省略了对其它爬虫的规定,想看全文的话,点击上面的链接
User-Agent: * #其他爬虫
Disallow: / #禁止访问所有页面
复制代码
Allow
代表可以被访问,Disallow
代表禁止被访问。而且有趣的是,淘宝限制了百度对产品页面的爬虫,却允许谷歌访问。
网站的服务器被爬虫爬得多了,也会受到较大的压力,因此,各大网站也会做一些反爬虫的措施。
不过呢,有反爬虫,也就有相应的反反爬虫
限制好爬虫的速度,对提供数据的服务器心存感谢,避免给它造成太大压力,维持良好的互联网秩序
总结
小作业1
获取文章《HTTP状态响应码》全部内容,并且打印出全文内容。
localprod.pandateacher.com/python-manu…
小作业2
从网上下载图片 user-gold-cdn.xitu.io/2019/6/9/16…
小作业3
从网上下载音乐 static.pandateacher.com/Over The Ra…
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 协议版本。
快速跳转:
猫哥教你写爬虫 000--开篇.md
猫哥教你写爬虫 001--print()函数和变量.md
猫哥教你写爬虫 002--作业-打印皮卡丘.md
猫哥教你写爬虫 003--数据类型转换.md
猫哥教你写爬虫 004--数据类型转换-小练习.md
猫哥教你写爬虫 005--数据类型转换-小作业.md
猫哥教你写爬虫 006--条件判断和条件嵌套.md
猫哥教你写爬虫 007--条件判断和条件嵌套-小作业.md
猫哥教你写爬虫 008--input()函数.md
猫哥教你写爬虫 009--input()函数-人工智能小爱同学.md
猫哥教你写爬虫 010--列表,字典,循环.md
猫哥教你写爬虫 011--列表,字典,循环-小作业.md
猫哥教你写爬虫 012--布尔值和四种语句.md
猫哥教你写爬虫 013--布尔值和四种语句-小作业.md
猫哥教你写爬虫 014--pk小游戏.md
猫哥教你写爬虫 015--pk小游戏(全新改版).md
猫哥教你写爬虫 016--函数.md
猫哥教你写爬虫 017--函数-小作业.md
猫哥教你写爬虫 018--debug.md
猫哥教你写爬虫 019--debug-作业.md
猫哥教你写爬虫 020--类与对象(上).md
猫哥教你写爬虫 021--类与对象(上)-作业.md
猫哥教你写爬虫 022--类与对象(下).md
猫哥教你写爬虫 023--类与对象(下)-作业.md
猫哥教你写爬虫 024--编码&&解码.md
猫哥教你写爬虫 025--编码&&解码-小作业.md
猫哥教你写爬虫 026--模块.md
猫哥教你写爬虫 027--模块介绍.md
猫哥教你写爬虫 028--模块介绍-小作业-广告牌.md
猫哥教你写爬虫 029--爬虫初探-requests.md
猫哥教你写爬虫 030--爬虫初探-requests-作业.md
猫哥教你写爬虫 031--爬虫基础-html.md
猫哥教你写爬虫 032--爬虫初体验-BeautifulSoup.md
猫哥教你写爬虫 033--爬虫初体验-BeautifulSoup-作业.md
猫哥教你写爬虫 034--爬虫-BeautifulSoup实践.md
猫哥教你写爬虫 035--爬虫-BeautifulSoup实践-作业-电影top250.md
猫哥教你写爬虫 036--爬虫-BeautifulSoup实践-作业-电影top250-作业解析.md
猫哥教你写爬虫 037--爬虫-宝宝要听歌.md
猫哥教你写爬虫 038--带参数请求.md
猫哥教你写爬虫 039--存储数据.md
猫哥教你写爬虫 040--存储数据-作业.md
猫哥教你写爬虫 041--模拟登录-cookie.md
猫哥教你写爬虫 042--session的用法.md
猫哥教你写爬虫 043--模拟浏览器.md
猫哥教你写爬虫 044--模拟浏览器-作业.md
猫哥教你写爬虫 045--协程.md
猫哥教你写爬虫 046--协程-实践-吃什么不会胖.md
猫哥教你写爬虫 047--scrapy框架.md
猫哥教你写爬虫 048--爬虫和反爬虫.md
猫哥教你写爬虫 049--完结撒花.md