抓取二进制数据
在上面的例子中,我们抓取的是知乎的一个页面,实际上它返回的是一个HTML文档。如果想抓取图片、视频、音频等文件应该怎么办呢?
图片、音频、视频这些文件实际上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,想要抓取它们,就要拿到它们的二进制码。
下面以GitHub的站点图标为例来看一下:
这里抓取的内容是站点图标,也就是在浏览器每一个标签上显示的小图标:
站点图标
这里打印了Response对象的两个属性,一个是text,另一个是content。
运行结果如图所示,其中前两行是r.text的结果,最后一行是r.content的结果:
二进制码
可以注意到,前者出现了乱码,后者结果前带有一个b,这代表是bytes类型的数据。由于图片是二进制数据,所以前者在打印时转化为str类型,也就是图片直接转化为字符串,这理所当然会出现乱码。
接着我们将刚才提取到的图片保存下来:
代码
这里用了open( )方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据。
运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标:
图标
同样地,视频和音频文件也可以用这种方法获取。
与urllib.request一样,我们也可以通过headers参数来传递头信息。
比如,在上面“知乎”的例子中,如果不传递headers,就不能正常请求:
代码
运行结果如下:
但如果加上headers并加上User-Agent信息,那就没有问题了;
当然,我们可以在headers这个参数中任意添加其他的字段信息。
POST请求
前面我们了解了最基本的GET请求,另外一种比较常见的请求方式是POST。使用requests实现POST请求同样非常简单,示例如下:
这里还是请求上面图中的网站,该网站可以判断如果请求是POST方式,就把相关请求信息返回。运行结果如下:
可以发现,我们成功获得了返回结果,其中form部分就是提交的数据,这就证明POST请求成功发送了。
响应
发送请求后,得到的自然就是响应。在上面的实例中,我们使用text和content获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息。比如状态码、响应头、COOKIEs等。示例如下:
这里分别打印输出status_code属性得到状态码,输出headers属性得到响应头,输出COOKIEs属性得到COOKIEs,输出url属性得到URL,输出history属性得到请求历史:
状态码通常用来判断是否请求成功,我们这里可以看到状态码是403,所以我们的请求是不成功的,我们可以通过添加headers来尝试看看能否请求成功:
加入头部信息
运行结果如下
请求成功
我们可以看到在加入了头部信息之后,我们的请求就成功了。