引言
一直觉得,国家地理的每日图片十分漂亮,值得去收藏。最近正好在学习Python,看了诸多教程,接受了诸多大佬们的知识共享,最终完成了自己的爬虫。于是决定写下这篇文章,一来作为自己学习的记录,二来也是方便了后人。第一次写文章,难免有所不足,欢迎发表评论
准备环境
注意: 本文的Python环境是基于windows 10的Python 3.6.3 ,不同的系统版本和Python版本可能会导致某些问题的发生
- 需要用到的东西
Python 本体
Beautifulsoup 库
Requests 库
1. 获取Python与pip
Python的获取十分简单,Python官网上就有各个系统不同版本的Python下载,注意下载对应自己系统以及系统位数的版本。
Python的安装也是很简单的,基本按照默认配置一路Next就行了。需要注意的两点是勾选安装pip和添加到Path。
安装完Python后,打开CMD,输入Python
并按回车,进去Python交互模式。如果出现如图样式,就是安装成功了。
在交互模式中输入exit()
退出交互模式,并输入pip
按回车,如果出现如图样式,说明pip安装成功了。
2. 配置需要用到的库
在cmd中,输入pip install requests
安装Request库,等待其自动安装完成。这个库里面是有关Python的Http请求库,其中的函数提供了十分方便的Http操作。
Requests库安装成功后,输入pip install bs4
安装Beautifulsoup库。这个库中主要提供对HTML的解析。它提供了一个非常好的解析HTML的解析器,使得提取HTML中的内容变得十分简单。
这两个库安装完后,我们就可以愉快地开始我们的Coding了~
分析网页
1. 分析每日一图URL
首先,找到我们要爬取的内容:国家地理
开启开发人员工具的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。
将返回的HTML复制到Notepad++上,利用搜索功能,很容易就找到了今日的每日一图的URL
找到了这个,也就是说,我只要向
https://www.nationalgeographic.com/photography/photo-of-the-day/
发送一个GET请求,就能在它返回的HTML中获得正确的今日图片URL。
2. 确定图片URL
我尝试着通过Network抓包的方式来获取图片URL,并根据图片请求的URL来找到其在HTML里面的相应位置,而无奈的是,我似乎只能找到一些低分辨率的图片版本而找不到原版?(有可能是我比较迷糊找不到,如果有晓得怎么操作的老哥欢迎赐教)
于是乎,我直接点开了页面源码,试图在页面源码中找到相应内容。
所幸的是,大图的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库的文档,如果对文中用到的函数不了解的,可以在这两份文档中获得完整的解析。(文档有简体中文版)
最后最后,附上这只小爬虫的完整源代码。
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()