美文网首页
用Python爬取国家地理每日图片

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

作者: Xzavier2 | 来源:发表于2017-12-01 16:51 被阅读0次

    引言

    一直觉得,国家地理的每日图片十分漂亮,值得去收藏。最近正好在学习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()
    

    相关文章

      网友评论

          本文标题:用Python爬取国家地理每日图片

          本文链接:https://www.haomeiwen.com/subject/lpylbxtx.html