2021春项目需求记录 python实现模拟登录+爬取NASA Modis 上的产品数据

本文记录了一次使用Python实现模拟登录NASA Modis网站并爬取产品数据的过程。通过学习和实践,掌握了Cookie、selenium库以及基础爬虫知识。项目主要功能在四月中旬完成,涉及需求分析、基本思路和代码实现。由于后期未实际应用,故还有待优化。文章提供了nasa_moids.py、autoClick.py和login.py的相关代码片段。
摘要由CSDN通过智能技术生成

python实现模拟登录+爬取Nasa Modis 上的产品数据

概述

3月的中旬时候参与了学校的一个大创项目,作为本科生,本人只是摸鱼打杂,负责了其中的一个功能模块:爬取NASA Modis数据。

整个过程也只是慢慢修改增添方案,主体功能于四月中旬基本完成。因为后续并未真正用到,所以自己还没进行更多优化,请各位谅解。如个人使用参考,可以试试这个爬虫。(2021年3-5月期间的,最近没留意网站更新)

整个过程中,可以收获对Cookie、python的selenium库以及基本爬虫知识的一定了解(也是我自己学到的一些东西)。

需求分析

在这里插入图片描述
如图,上框为用户浏览网页时见到的URL,中间位置的框依次为产品号,日期范围,区域经纬度范围,下框为筛选条件下的目标文件。

可见,使用者可以根据不同条件筛选产品。

中间URL:
在这里插入图片描述
Request Headers(其中最重要的是Cookie!所以需要想办法获取!):
在这里插入图片描述
从Preview页面可以看到下载URL及相关信息,访问下载URL并进行下载需要登陆或通过Cookie:
在这里插入图片描述

基本思路

在这里插入图片描述
在这里插入图片描述

代码

nasa_moids.py:
目前还未采用Scrapy下载(获得Cookie和下载URL后),后续可以考虑以此为优化角度。

import requests
import json
import os
import random
import time
import datetime
from dateutil.relativedelta import relativedelta
import autoClick

__author__ = 'Ray'

'''
Task:输入产品信息,附加筛选条件,自动爬取Modis遥感数据

观察/记录:
    1.数据一般延时更新,且所选区域在部分日期下没有数据
    2.仅hdf所在URL需要cookies,所以应模拟登录获取Cookies(其实短期内Cookies不变,如果不要求过高,可以手动输入Cookies)
    3.要用到中间URL,找规律

Tips:
    1.网络事先需要连接好,并保持稳定,否则不只会影响模拟点击。(看到一种说法是借助浏览器厂商差异,换FireFox,还未尝试)
    2.Modis网站的服务器运行状况良好
    3.解决访问时间过长,模拟点击报错问题!(循环尝试?),下载URL卡死问题
    4.目前的访问和下载速度较慢,考虑异步,多线程下载或其他方式
    5.ban,代理池,访问频率(考虑要不要定期清除Cookie)
    6.符合使用需求
    7.后续维护问题,观察网站变化,也要靠考虑浏览器版本升级与驱动的兼容
'''


class Nasa:  # 面向对象编程,创建类
    def __init__(self):
        self.headers1 = {
   
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
            'Referer': 'https://ladsweb.modaps.eosdis.nasa.gov/search/order/4/MOD11A1--6/2021-02-22..2021-03-08/DB/97,30.1,107.1,21.2',
            'Host': 'ladsweb.modaps.eosdis.nasa.gov',
            'Accept': '*/*',
            'Connection': 'keep-alive',
            'X-Requested-With': 'XMLHttpRequest'}
        # 还未修改Referer!!
        # 留意下headers会不会变化
        # 当遇到403时,headers的内容越全越有希望,除了在get()方法中添加cookies参数,也可以在headers字典中添加cookies
        self.headers2 = {
   
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"}

    # 获取当前日期范围
    def getDate(self, if_range='last month', range=20):
        # example: '2021-02-22..2021-03-08'
        date = time.strftime('%Y-%m-%d', time.localtime())

        # 如果是范围筛选,还要考虑年份和月份的灵活变化
        if if_range == 'all':
            date = '2020-01-01..' + date
        else:
            date = str(datetime.date.today() + relativedelta(days=-30)) + '..' + str(date)

        print('Date range:' + str(date) + '\n')
        return date

    # 获取页面
    def getPage(self, url, cookie=None):
        try:
            re = requests.get(url, headers=self.headers1, timeout=(9.05, 6.05), cookies=cookie)
            print('已完成get指令')
            print(re.status_code)
            re.raise_for_status()
            re.encoding = re.apparent_encoding
            print('获取页面成功!准备return')
            # time.sleep(1)
            return re
        except requests.exceptions.RequestException as e:
            print(e)
            print('请求失败!您的网络状况可能存在一点问题,需重试')

    # 将开发者工具界面中,Headers里显示的cookie转换为字典
    def cookieToDict(self, cookie):
        cookie = cookie.split(';')
        cok = dict()
        for i in cookie:
            part = i.split('=')
            part[0] = part[0].strip(' ')
            cok
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值