什么是爬虫?
从本质上来讲,就是利用程序在网上拿到对咱们有价值的数据
爬虫能作不少事,能作商业分析,也能作生活助手,
好比:分析北京近两年二手房成交均价是多少?
深圳的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的响应状态码,以检查请求是否成功
复制代码
接着的属性是
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…
1xx:临时响应
表示临时响应并须要请求者继续执行操做的状态代码。
2xx : 成功
表示成功处理了请求的状态代码。
3xx : 重定向
表示要完成请求,须要进一步操做。一般,如下状态代码用来重定向。
4xx:请求错误
如下状态代码表示请求可能出错,妨碍了服务器的处理。
5xx:服务器错误
如下状态代码表示服务器在尝试处理请求时发生内部错误。
这些错误多是服务器自己的错误,而不是请求出错。
500 服务器内部错误 服务器遇到错误,没法完成请求。 501 还没有实施服务器不具有完成请求的功能。例如,服务器没法识别请求方法时可能会返回此代码。 502 错误网关服务器做为网关或代理,从上游服务器收到无效响应。 503 服务不可用服务器目前没法使用(因为超载或停机维护)。一般,这只是暂时状态。 504 网关超时 服务器做为网关或代理,可是没有及时从上游服务器收到请求。 505 HTTP 版本不受支持服务器不支持请求中所用的 HTTP 协议版本。html
猫哥教你写爬虫 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--完结撒花.mdpython