python爬虫requests一万条数据_Python爬虫之使用requests库抓取二进制数据

抓取二进制数据

在上面的例子中,我们抓取的是知乎的一个页面,实际上它返回的是一个HTML文档。如果想抓取图片、视频、音频等文件应该怎么办呢?

图片、音频、视频这些文件实际上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,想要抓取它们,就要拿到它们的二进制码。

下面以GitHub的站点图标为例来看一下:

u=2692051188,1373395475&fm=173&app=49&f=JPEG?w=640&h=237&s=E8C2A1444EE08F704A6D75070000E0C1

这里抓取的内容是站点图标,也就是在浏览器每一个标签上显示的小图标:

u=4219451259,2193669674&fm=173&app=49&f=JPEG?w=364&h=90&s=E2231F604B624D304C5568DA000080B3站点图标

这里打印了Response对象的两个属性,一个是text,另一个是content。

运行结果如图所示,其中前两行是r.text的结果,最后一行是r.content的结果:

u=93411126,2197500220&fm=173&app=49&f=JPEG?w=640&h=159&s=C8E23365CAE089704C51F8020100E081二进制码

可以注意到,前者出现了乱码,后者结果前带有一个b,这代表是bytes类型的数据。由于图片是二进制数据,所以前者在打印时转化为str类型,也就是图片直接转化为字符串,这理所当然会出现乱码。

接着我们将刚才提取到的图片保存下来:

u=1047374399,1904096226&fm=173&app=49&f=JPEG?w=640&h=226&s=A8C2A5445BE0BD70466D74030000E0C1代码

这里用了open( )方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据。

运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标:

u=2383892025,515219014&fm=173&app=49&f=JPEG?w=640&h=201&s=57B5EC6C8A820F705EB9201F0000D0C2图标

同样地,视频和音频文件也可以用这种方法获取。

与urllib.request一样,我们也可以通过headers参数来传递头信息。

比如,在上面“知乎”的例子中,如果不传递headers,就不能正常请求:

u=2082635713,2720740992&fm=173&app=49&f=JPEG?w=640&h=257&s=A8C2A1443AE09F6C485D75060000E0C1代码

运行结果如下:

u=4163668817,4186607747&fm=173&app=49&f=JPEG?w=640&h=279&s=69E213671BE09F684C59F1060000E0C1

但如果加上headers并加上User-Agent信息,那就没有问题了;

u=4255912064,1195221591&fm=173&app=49&f=JPEG?w=640&h=112&s=A8C2B74ACEA2B764067D840B0000E0C1

当然,我们可以在headers这个参数中任意添加其他的字段信息。

POST请求

前面我们了解了最基本的GET请求,另外一种比较常见的请求方式是POST。使用requests实现POST请求同样非常简单,示例如下:

u=259866594,3344846740&fm=173&app=49&f=JPEG?w=640&h=214&s=A8C2A3444FE189604E5D64070000A0C3

这里还是请求上面图中的网站,该网站可以判断如果请求是POST方式,就把相关请求信息返回。运行结果如下:

u=69342667,3299667434&fm=173&app=49&f=JPEG?w=640&h=407&s=E0F223655AA4B76E4CD1D40F0000E0C0

可以发现,我们成功获得了返回结果,其中form部分就是提交的数据,这就证明POST请求成功发送了。

响应

发送请求后,得到的自然就是响应。在上面的实例中,我们使用text和content获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息。比如状态码、响应头、Cookies等。示例如下:

u=9700187,2036878446&fm=173&app=49&f=JPEG?w=640&h=284&s=A8C0B54412F0AD6A0AED79030000E0C1

这里分别打印输出status_code属性得到状态码,输出headers属性得到响应头,输出cookies属性得到cookies,输出url属性得到URL,输出history属性得到请求历史:

u=3501743459,3552993860&fm=173&app=49&f=JPEG?w=640&h=80

状态码通常用来判断是否请求成功,我们这里可以看到状态码是403,所以我们的请求是不成功的,我们可以通过添加headers来尝试看看能否请求成功:

u=1908234334,4127742136&fm=173&app=49&f=JPEG?w=640&h=125&s=A0C2B548CEA2B7740AFCC50F0000E0C1加入头部信息

运行结果如下

u=1075321549,3087861610&fm=173&app=49&f=JPEG?w=640&h=91请求成功

我们可以看到在加入了头部信息之后,我们的请求就成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值