用爬虫获取数据
学习利用一个强大的库——requests来获取数据;
电脑上安装requests方法是:在Mac电脑里打开终端软件(terminal),输入pip3 install requests,然后点击enter即可;Windows电脑里叫命令提示符(cmd),输入pip install requests 即可。
requests库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
requests.get()方法具体用法:
第1行代码,是引用requests库。
第3行代码,requests.get()发送了请求,然后得到了服务器的响应。服务器返回的结果是个Response对象,现在存储到了我们定义的变量res中。
我们试着用requests.get()来下载一个小说——《三国演义》:
小说的URL(网址)是:https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md
Response对象的常用属性:
Python是一门面向对象编程的语言,而在爬虫中,理解数据是什么对象是非常、特别、以及极其重要的一件事。因为只有知道了数据是什么对象,我们才知道对象有什么属性和方法可供我们操作。
通过print(type(res))发现:res是一个对象,属于requests.models.Response类。既然已经知道res是一个Response对象了,我们也就可以去了解它的相应属性和方法了。
Response对象常用的四个属性:
1、response.status_code:
res的响应状态码解释:
response.status_code是一个很常用的属性,在爬虫代码中将多次出现。
2、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()
3、response.text:这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
代码举例如下:
import requests
#引用requests库
res=requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
#下载《三国演义》第一回,我们得到一个对象,它被命名为
resnovel=res.text
#把Response对象的内容以字符串的形式返回
print(novel[:800])
#现在,可以打印小说了,但考虑到整章太长,只输出800字看看就好。在关于列表的知识那里,你学过[:800]的用法。
4、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呢?
首先,目标数据本身是什么编码是未知的。用requests.get()发送请求后,我们会取得一个Response对象,其中,requests库会对数据的编码类型做出自己的判断。但是!这个判断有可能准确,也可能不准确。
如果它判断准确的话,我们打印出来的response.text的内容就是正常的、没有乱码的,那就用不到res.encoding;如果判断不准确,就会出现一堆乱码,那我们就可以去查看目标数据的编码,然后再用res.encoding把编码定义成和目标数据一致的类型即可。
总的来说,遇上文本的乱码问题,才考虑用res.encoding。
总结:
爬虫伦理:爬虫的道德标准
Robots协议是互联网爬虫的一项公认的道德规范,它的全称是“网络爬虫排除标准”(Robots exclusion protocol),这个协议用来告诉爬虫,哪些页面是可以抓取的,哪些不可以。
如何查看网站的robots协议呢,很简单,在网站的域名后加上/robots.txt就可以了。
协议里最常出现的英文是Allow和Disallow,Allow代表可以被访问,Disallow代表禁止被访问。而且有趣的是,淘宝限制了百度对产品页面的爬虫,却允许谷歌访问。
虽然Robots协议只是一个道德规范,和爬虫相关的法律也还在建立和完善之中,但我们在爬取网络中的信息时,也应该有意识地去遵守这个协议。