前言

最近,我使用爬虫技术,爬取了美国航空航天局,也就是你电影里经常见到的 NASA, 火星探索的相关图片,有 10000 张吧。

嗯嗯,小事情,小事情。

完事儿之后,有点小激动,于是就有了这篇文章,将有以下内容:

  1. 我为什么要爬取NASA的图片
  2. 我是如何爬取NASA图片的(超详细)
  3. 我得到了什么(高清大图)
  4. 我发现了什么秘密(超劲爆)

我为什么要爬NASA的图片

我已经超过35了,瑟瑟发抖啥时候被开了。

天天想着万一哪天失业了干点啥,想着玩个自媒体吧,天天给大家瞎白话。白话点历史谜团,宇宙奥秘啥的,于是我就盯上了 NASA

NASA 有各种宇宙探索任务,并且有相关的文章,访谈,图片,视频公开,这是不可多得的资源库。

我是如何爬取NASA图片的(超详细)

NASA 的网站是可以公开访问的,地址是

  1. https://www.nasa.gov/

打开以后,它首页长这样,可以看到各种内容。右上角还有个搜索框,我们输入 Mars 也就是 火星

稍等片刻,会展示出与 Mars 相关的各种内容,其中有一项 Mars Exploration 也就是 火星探索

点开之后,就到了一个新页面,然后找到 Images 图片,就到了我们爬取的目标页

  1. https://www.nasa.gov/mission_pages/mars/images/index.html

页面下拉,你将会看到有个大大的按钮,上面写着 MORE IMAGES, 点击试试你就发现:

页面的内容,并不是页面直接加载的,而是通过 api 请求后,异步渲染的

F12, 打开浏览器开发者模式,重新执行刚才的步骤,观察请求信息,发现都会有如下的情况

看上去这个url地址非常重要,我们先看他的请求地址:

  1. https://www.nasa.gov/api/2/ubernode/_search?size=24&from=24&sort=promo-date-time%3Adesc&q=((ubernode-type%3Aimage)%20AND%20(topics%3A3152))&_source_include=promo-date-time%2Cmaster-image%2Cnid%2Ctitle%2Ctopics%2Cmissions%2Ccollections%2Cother-tags%2Cubernode-type%2Cprimary-tag%2Csecondary-tag%2Ccardfeed-title%2Ctype%2Ccollection-asset-link%2Clink-or-attachment%2Cpr-leader-sentence%2Cimage-feature-caption%2Cattachments%2Curi

注意看里面的参数

  1. size=24&from=24

很显然,size 就是每次请求图片的数量,from 经过试验,是查询初始位置,我们可以改它来获取其他内容

我们再来看看它的返回信息:

  1. {
  2. "took": 3,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 5,
  6. "successful": 5,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": 659,
  12. "max_score": null,
  13. "hits": [{
  14. "_index": "nasa-public",
  15. "_type": "ubernode",
  16. "_id": "450040",
  17. "_score": null,
  18. "_source": {
  19. "image-feature-caption": "Mars 2020 rover underwent an eye exam after several cameras were installed on the rover. ",
  20. "topics": ["3140", "3152"],
  21. "nid": "450040",
  22. "title": "NASA 'Optometrists' Verify Mars 2020 Rover's 20/20 Vision",
  23. "type": "ubernode",
  24. "uri": "/image-feature/jpl/nasa-optometrists-verify-mars-2020-rovers-2020-vision",
  25. "collections": ["4525", "5246"],
  26. "link-or-attachment": "link",
  27. "missions": ["6336"],
  28. "primary-tag": "6336",
  29. "cardfeed-title": "NASA 'Optometrists' Verify Mars 2020 Rover's 20/20 Vision",
  30. "promo-date-time": "2019-08-05T17:49:00-04:00",
  31. "secondary-tag": "3140",
  32. "master-image": {
  33. "fid": "603128",
  34. "alt": "Engineers test cameras on the top of the Mars 2020 rover’s mast and front chassis. ",
  35. "width": "1600",
  36. "id": "603128",
  37. "title": "Engineers test cameras on the top of the Mars 2020 rover’s mast and front chassis. ",
  38. "uri": "public://thumbnails/image/pia23314-16.jpg",
  39. "height": "900"
  40. },
  41. "ubernode-type": "image"
  42. },
  43. "sort": [1565041740000]
  44. }, {
  45. "_index": "nasa-public",
  46. "_type": "ubernode",
  47. "_id": "433172",
  48. "_score": null,
  49. "_source": {
  50. "image-feature-caption": "NASA still hasn't heard from the Opportunity rover, but at least we can see it again.",
  51. "topics": ["3152"],
  52. "nid": "433172",
  53. "title": "Opportunity Emerges in a Dusty Picture",
  54. "type": "ubernode",
  55. "uri": "/image-feature/opportunity-emerges-in-a-dusty-picture",
  56. "collections": ["7628"],
  57. "link-or-attachment": "link",
  58. "missions": ["3639"],
  59. "primary-tag": "3152",
  60. "cardfeed-title": "Opportunity Emerges in a Dusty Picture",
  61. "promo-date-time": "2018-09-26T12:39:00-04:00",
  62. "secondary-tag": "7628",
  63. "master-image": {
  64. "fid": "584263",
  65. "alt": "NASA's Opportunity rover appears as a blip in the center of this square",
  66. "width": "1400",
  67. "id": "584263",
  68. "title": "NASA's Opportunity rover appears as a blip in the center of this square",
  69. "uri": "public://thumbnails/image/pia22549-16.jpg",
  70. "height": "788"
  71. },
  72. "ubernode-type": "image"
  73. },
  74. "sort": [1537979940000]
  75. }]
  76. }
  77. }

上面的 json 内容太长,我删除了一些重复的,实际上 hits 这个数组,也是24个,和页面上显示的图片数量是一样的。那基本可以断定,页面上的信息,就是从这个数组来的。

进而对比发现,master-image字段下,就是我们需要的信息,包括 图片地址, 图片尺寸, 图片标题

下面就上代码,组装请求URL, 获取内容,下载图片 三步走

我使用了 Dart 语言,你们随意

  1. import 'dart:convert';
  2. import 'package:dio/dio.dart';
  3. main() async {
  4. // 每页数量是固定24个,改变初始值即可
  5. for (int from = 0; from < 24 * 100; from = from + 24) {
  6. await getPage(from);
  7. }
  8. }
  9. //获取每一页的信息并且下载
  10. Future<void> getPage(int from) async {
  11. String url = 'https://www.nasa.gov/api/2/ubernode/_search?size=24&from=' +
  12. from.toString() +
  13. '&sort=promo-date-time%3Adesc&q=((ubernode-type%3Aimage)%20AND%20(topics%3A3152))&_source_include=promo-date-time%2Cmaster-image%2Cnid%2Ctitle%2Ctopics%2Cmissions%2Ccollections%2Cother-tags%2Cubernode-type%2Cprimary-tag%2Csecondary-tag%2Ccardfeed-title%2Ctype%2Ccollection-asset-link%2Clink-or-attachment%2Cpr-leader-sentence%2Cimage-feature-caption%2Cattachments%2Curi';
  14. //获取到内容
  15. var res = await Dio().get(url);
  16. var map = jsonDecode(res.toString());
  17. (map['hits']['hits'] as List<dynamic>).forEach((element) async {
  18. Uri fileUri = Uri.parse(getUri(element));
  19. String savePath = getSavePath(element);
  20. await Dio().downloadUri(fileUri, savePath);
  21. print('已下载: ' + savePath);
  22. });
  23. }
  24. //获取图片下载地址
  25. String getUri(dynamic element) {
  26. String uri = element['_source']['master-image']['uri'].toString();
  27. uri = uri.replaceAll('public://',
  28. 'https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/');
  29. return uri;
  30. }
  31. //处理信息,并且返回图片保存地址
  32. String getSavePath(dynamic element) {
  33. String id = element['_id'];
  34. String fid = element['_source']['master-image']['fid'].toString();
  35. String title = element['_source']['master-image']['title'].toString();
  36. String uri = element['_source']['master-image']['uri'].toString();
  37. String savePath =
  38. id + '_' + fid + '_' + title.trim() + '.' + uri.split('.').last;
  39. savePath = savePath.replaceAll('/', '');
  40. savePath = savePath.replaceAll('\\', '');
  41. savePath = savePath.replaceAll('"', '');
  42. savePath = 'images/' + savePath;
  43. return savePath;
  44. }

上面的代码,还是很简单的,有经验的同学应该一看就懂。

走起来吧。

  1. 已下载: images/470436_643588_This is the third color image taken by NASAs Ingenuity helicopter.jpg
  2. 已下载: images/470435_643587_This is the second color image taken by NASAs Ingenuity helicopter.jpg
  3. 已下载: images/468546_639327_This is the first high-resolution, color image to be sent back by the Hazard Cameras (Hazcams).jpg
  4. 已下载: images/452007_605784_Danielson Crater on Mars.jpg
  5. 已下载: images/458478_615132_Gullies on Mars.jpg
  6. 已下载: images/469416_641582_A field of sand dunes occupies this frosty 5-kilometer diameter crater in the high-latitudes of the northern plains of Mars..jpeg
  7. 已下载: images/458075_614251_Mars 2020 With Sample Tubes (Artist's Concept).jpg
  8. 已下载: images/470381_643473_CME.jpg
  9. 已下载: images/458813_615896_Mars.jpg
  10. 已下载: images/467026_635309_Illustration of NASA’s Perseverance rover begins its descent through the Martian atmosphere.jpg
  11. 已下载: images/470438_643591_This black and white image was taken by NASA’s Ingenuity helicopter during its third flight on April 25, 2021.jpg
  12. 已下载: images/465488_631398_Cliffs in Ancient Ice on Mars.jpg
  13. 已下载: images/463659_626874_Avalanche on Mars.jpg
  14. 已下载: images/470251_643164_This image from NASA’s Perseverance rover shows the agency’s Ingenuity Mars Helicopter right after it successfully completed a high-speed spin-up test..jpeg
  15. 已下载: images/468636_639726_Mars' Jezero Crater.jpg

我得到了什么

这些图片

还有这些

图片,图片标题都有了, 够看一个月了我估计。

我发现了什么秘密

这张图,我最喜欢了。一个如此清晰,一个如此浑浊,这是为什么? 火星人的裂缝产生器?

好吧,真正的秘密是:

NASA 的网站竟然没有防采集,不信你也试试。。。

爬了10000张NASA关于火星探索的图片,我发现了一个秘密的更多相关文章

  1. 通过Kubernetes监控探索应用架构,发现预期外的流量

    大家好,我是阿里云云原生应用平台的炎寻,很高兴能和大家一起在 Kubernetes 监控系列公开课上进行交流.本次公开课期望能够给大家在 Kubernetes 容器化环境中快速发现和定位问题带来新的解 ...

  2. 探索Linux内核:Kconfig / kbuild的秘密

    探索Linux内核:Kconfig / kbuild的秘密 文章目录 探索Linux内核:Kconfig / kbuild的秘密 深入了解Linux配置/构建系统的工作原理 Kconfig kbuil ...

  3. 【Python网络爬虫四】通过关键字爬取多张百度图片的图片

    最近看了女神的新剧<逃避虽然可耻但有用>,同样男主也是一名程序员,所以很有共鸣 被大只萝莉萌的一脸一脸的,我们来爬一爬女神的皂片. 百度搜索结果:新恒结衣 本文主要分为4个部分: 1.下载 ...

  4. 用python爬取一张仓鼠图片

    一. 找到一张仓鼠图片并复制一下它的url url='http://img.go007.com/2017/08/16/c407f5b732f4e748_2.jpg' 二. 调用urllib库 impo ...

  5. Python爬取10000条“爆款剧”——《三十而已》热评,并做可视化

    前言 继<隐秘的角落>后,又一部“爆款剧”——<三十而已>获得了口碑收视双丰收,王漫妮.顾佳.钟晓芹三个女主角的故事线频频登上微博热搜.该剧于2020年7月17日在东方卫视首播 ...

  6. 爬虫2 urllib3 爬取30张百度图片

    import urllib3 import re # 下载百度首页页面的所有图片 # 1. 找到目标数据 # page_url = 'http://image.baidu.com/search/ind ...

  7. async 异步抓取 花瓣网高清大图 30s爬取500张

    废话 不多说,直接上代码,不懂得看注释 先安装  pip install aiohttp "异步抓取花瓣网图片" # pip install aiohttp import requ ...

  8. SpringBoot图片上传(四) 一个input上传N张图,支持各种类型

    简单介绍:需求上让实现,图片上传,并且可以一次上传9张图,图片格式还有要求,网上找了一个测试了下,好用,不过也得改,仅仅是实现了功能,其他不尽合理的地方,还需自己打磨. 代码: //html<d ...

  9. 怎么将一张100KB以上大小的电子图片压缩成30KB以内

    不多说,直接上干货! 方法一: 怎么将一张100KB以上大小的电子照片压缩成30KB以内. 先将这张100KB以上大小的电子照片,新建一个word,放入.选中照片,右击,另存为,格式依然还是选择.jp ...

  10. AFNetworking上传一张或多张图片,并压缩图片节约占用内存

    最近在做APP的时候,遇到了难题:根据公司需求,在用户评论并上传图片的时候,有的手机像素比较高拍的照片高清的,但是每张图片占用的内存太大,或者上传照片的时候,相册的部分照片本身就占很大内存空间,后台数 ...

随机推荐

  1. 类似-Xms、-Xmn这些参数的含义

    答: 堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的 ...

  2. H5调用微信支付

    这里用的是 vue项目; 首先在mounted中判断是否有openId,如果没有,则去获取 let openid = localStorage.getItem('openid'); if (!open ...

  3. Redis实现布隆过滤器解析

    布隆过滤器原理介绍 [1]概念说明 1)布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合 ...

  4. bootstrapValidator 参数校验框架

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  5. 齐博x1文本代码标签的使用

    文本标签虽然简单,但是使用的地方确实非常多的. {qb:tag name="XXXX" type="text"}推荐新闻{/qb:tag} 类似这种使用的频率是 ...

  6. Tauri-Vue3桌面端聊天室|tauri+vite3仿微信|tauri聊天程序EXE

    基于tauri+vue3.js+vite3跨桌面端仿微信聊天实例TauriVue3Chat. tauri-chat 运用最新tauri+vue3+vite3+element-plus+v3layer等 ...

  7. Java反序列化中jndi注入的高版本jdk绕过

    群里大佬们打哈哈的内容,菜鸡拿出来整理学习一下,炒点冷饭. 主要包含以下三个部分: jndi注入原理 jndi注入与反序列化 jndi注入与jdk版本 jndi注入原理: JNDI(Java Name ...

  8. fastjson反序列化漏洞历史CVE学习整理

    fastjson 1.2.24反序列化漏洞复现 先写一个正常的使用 fastjson的web服务 我们使用 springboot创建 主要是pom.xml 里面要添加fastjson fastjson ...

  9. 使用VsCode调试UE5的PuerTs

    使用VsCode调试UE5的PuerTs 1.下载测试的Demo项目 配置PuerTs的步骤这里不赘述. 2.准备工作 2.1 打开项目 正常来说,直接打开项目可以看到如下画面 如果直接点击运行,可以 ...

  10. 长事务 (Long Transactions)

    长事务 长事务用于支持 AutoCAD 参照编辑功能,对于 ObjectARX 应用程序非常有用.这些类和函数为应用程序提供了一种方案,用于签出实体以进行编辑并将其签回其原始位置.此操作会将原始对象替 ...