用Python爬取国家地理每日图片

引言

一直觉得,国家地理的每日图片十分漂亮,值得去收藏。最近正好在学习Python,看了诸多教程,接受了诸多大佬们的知识共享,最终完成了自己的爬虫。于是决定写下这篇文章,一来作为自己学习的记录,二来也是方便了后人。第一次写文章,难免有所不足,欢迎发表评论

准备环境

注意: 本文的Python环境是基于windows 10的Python 3.6.3 ,不同的系统版本和Python版本可能会导致某些问题的发生

  • 需要用到的东西

    Python 本体
    Beautifulsoup 库
    Requests 库

1. 获取Python与pip

Python的获取十分简单,Python官网上就有各个系统不同版本的Python下载,注意下载对应自己系统以及系统位数的版本。

Python下载

Python的安装也是很简单的,基本按照默认配置一路Next就行了。需要注意的两点是勾选安装pip添加到Path

安装pip,以获取海量库
添加Python到环境变量

安装完Python后,打开CMD,输入Python并按回车,进去Python交互模式。如果出现如图样式,就是安装成功了。

Python命令行

在交互模式中输入exit()退出交互模式,并输入pip按回车,如果出现如图样式,说明pip安装成功了。

pip

2. 配置需要用到的库

在cmd中,输入pip install requests安装Request库,等待其自动安装完成。这个库里面是有关Python的Http请求库,其中的函数提供了十分方便的Http操作。

图中因为我已经安装过Requests了,所以显示已存在

Requests库安装成功后,输入pip install bs4安装Beautifulsoup库。这个库中主要提供对HTML的解析。它提供了一个非常好的解析HTML的解析器,使得提取HTML中的内容变得十分简单。

同上,此为已经安装过Beautifulsoup

这两个库安装完后,我们就可以愉快地开始我们的Coding了~

分析网页

1. 分析每日一图URL

首先,找到我们要爬取的内容:国家地理

NG主页

开启开发人员工具的Network标签,进行抓包。我用的浏览器为火狐,按F12。
点击Photo of the day,进入每日一图。查看这时候的网址,我们很容易发现每日一图的URL的规律
https://www.nationalgeographic.com/photography/photo-of-the-day/2017/12/sicily-italy-cliffs/
如上,能够发现,该URL是由几个部分组成的。前面部分是固定的
https://www.nationalgeographic.com/photography/photo-of-the-day/
而后面部分是由年份,日期和照片的名字组成的。
2017/12/sicily-italy-cliffs/
我尝试直接访问前面的那部分固定的URL
进行了跳转

发现网站自动跳转到了今日图片的完整URL,这就很有趣了。
将Network标签内容翻到最前面,找到GET网页的请求,并分析它返回的HTML。
GET请求

将返回的HTML复制到Notepad++上,利用搜索功能,很容易就找到了今日的每日一图的URL
今日的每日一图URL,在meta元素里面

找到了这个,也就是说,我只要向https://www.nationalgeographic.com/photography/photo-of-the-day/发送一个GET请求,就能在它返回的HTML中获得正确的今日图片URL。

2. 确定图片URL

我尝试着通过Network抓包的方式来获取图片URL,并根据图片请求的URL来找到其在HTML里面的相应位置,而无奈的是,我似乎只能找到一些低分辨率的图片版本而找不到原版?(有可能是我比较迷糊找不到,如果有晓得怎么操作的老哥欢迎赐教)

1600 x 1066分辨率

于是乎,我直接点开了页面源码,试图在页面源码中找到相应内容。
大图URL

所幸的是,大图的URL并非隐藏极深,而是在开头就写了出来。这个也是在一个meta元素里面。
尝试访问一下:
成功获取到大图

ok,没问题,网页分析到此完毕。

敲代码

那么,获取了理论,接下去就要实践了。作为一个小脚本,我写的比较随意。而且我还仅仅处于初学者阶段,代码多有不周之处,如果看出了错误或者不规范的地方,欢迎指正。
首先新建一个py脚本文件,命名为NG.py

源文件命名没有要求,你可以起一个自己喜欢的名字

然后引入库。

import time                                #给每日一图以时间命名
import requests                            #提交HTTP请求
from bs4 import BeautifulSoup              #解析HTML

然后确定用于保存相片的文件名

#这里用到time模块来获取系统时间,Y m d对应年月日
NAME = time.strftime("%Y-%m-%d", time.localtime())  
NAME += r'.jpg'

然后开始我们的第一次HTTP请求

#设置每日一图的起始URL
URL = r'https://www.nationalgeographic.com/photography/photo-of-the-day'
#对起始URL执行GET请求
REQ = requests.get(URL)
#用返回的HTML生成一个Beautifulsoup对象
SOUP = BeautifulSoup(REQ.text, 'html.parser')
#用soup.find()方法找到"property"为"og:url"的'meta'元素
TAG = SOUP.find('meta', {"property": "og:url"})

这时候,我们就得到了包含有每日一图的URL的一个HTML标签TAG了。

#设置每日一图URL为TAG中的'content'元素
URL = TAG['content']
#对URL进行GET请求
REQ = requests.get(URL)
#将返回的内容转化为Beautiulsoup对象
SOUP = BeautifulSoup(REQ.text, 'html.parser')
#找到包含图片URL的TAG
TAG = SOUP.find('meta', {"property": "og:image"})

这时候,我们就得到了包含有图片URL的TAG了。

#设置图片URL
URL = TAG['content']
#对URL执行GET请求
REQ = requests.get(URL)
#判断是否请求成功,如果请求成功,就把返回的图片输出到本地。
if REQ.status_code == 200:
    open(NAME, 'wb').write(REQ.content)
else:
    print('Failed to get image.')

代码到这里就写完了,测试一下,在存放源代码的文件夹shift+右键点击在这里打开PowerShell,键入python .\NG.py并静待执行完成:

执行完毕

可以看到,我们的文件夹中,已经多出了一个图片文件,而内容也正是我们要的那张图片。
成功获取到图片

小结

这篇文章写到这里也算是结束了。这只小爬虫,相对于其他爬虫来说,算是比较简单的一只爬虫了。不得不说,Request库Beautifulsoup库是很强大的存在,有了它们的协助,开发爬虫的难度直线下降。
这里也顺带提供一下Request库Beautifulsoup库的文档,如果对文中用到的函数不了解的,可以在这两份文档中获得完整的解析。(文档有简体中文版)

Requests 文档
Beautifulsoup 文档

最后最后,附上这只小爬虫的完整源代码。

import time
import requests
from bs4 import BeautifulSoup

NAME = time.strftime("%Y-%m-%d", time.localtime())
NAME += r'.jpg'

URL = r'https://www.nationalgeographic.com/photography/photo-of-the-day'
REQ = requests.get(URL)
SOUP = BeautifulSoup(REQ.text, 'html.parser')
TAG = SOUP.find('meta', {"property": "og:url"})

URL = TAG['content']
REQ = requests.get(URL)
SOUP = BeautifulSoup(REQ.text, 'html.parser')
TAG = SOUP.find('meta', {"property": "og:image"})

URL = TAG['content']
REQ = requests.get(URL)
if REQ.status_code == 200:
    open(NAME, 'wb').write(REQ.content)
else:
    print('Failed to get image.')
    exit()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,712评论 6 28
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,491评论 6 427
  • GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-p...
    若与阅读 18,660评论 4 418
  • 环境管理管理Python版本和环境的工具。p–非常简单的交互式python版本管理工具。pyenv–简单的Pyth...
    MrHamster阅读 3,797评论 1 61
  • “呵呵……你就是这样对妈妈的吗?”韩若冰两眼冷冷的看着她曾经的爸爸,现在不是,因为他杀死了妈妈。 “我和她早就...
    唐健华阅读 241评论 2 1