身份验证背后的 Web Scraper

Posted

技术标签:

【中文标题】身份验证背后的 Web Scraper【英文标题】:Web Scraper Behind Authentication 【发布时间】:2022-01-22 11:16:42 【问题描述】:

我是一名新手程序员,试图通过自动将 .ict 文件转换为 .csv 文件来加速数据分析过程。

我正在尝试创建一个 Python 程序,该程序可以轻松地将 .ict 文件从 NASA 的 Earthdata 网站转换为 .csv 文件以进行数据分析。我计划通过创建一个数据抓取器来访问这些文件来做到这一点,但它们位于用户身份验证墙的后面。我计划访问的数据集可在此链接中找到: https://asdc.larc.nasa.gov/data/AJAX/O3_1/2018/02/28/AJAX-O3_ALPHA_20180228_R1_F220.ict

这是我从https://curlconverter.com/# 收集并添加的代码,用于将数据发送到“登录”我的会话:

import requests
from bs4 import BeautifulSoup

cookies = 
    '_ga': '',
    '_gid': '',
    '_gat_GSA_ENOR0': '1',
    '_gat_UA-62340125-1': '1',
    '_gat_eui_tracker': '1',
    '_gat_UA-50960810-3': '1',
    '_urs-gui_session': '',
    '_gat_UA-62340125-2': '1',


headers = 
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'https://urs.earthdata.nasa.gov',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': '',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://urs.earthdata.nasa.gov/oauth/authorize?response_type=code&client_id=OLpAZlE4HqIOMr0TYqg7UQ&redirect_uri=https%3A%2F%2Fd53njncz5taqi.cloudfront.net%2Furs_callback&state=https%3A%2F%2Fsearch.earthdata.nasa.gov%2Fsearch%3Fee%3Dprod',
    'Accept-Language': 'en-US,en;q=0.9',


data = 
  'utf8': '',
  'authenticity_token': '',
  'username': '',
  'password': '',
  'client_id': '',
  'redirect_uri': '',
  'response_type': 'code',
  'state': 'https://search.earthdata.nasa.gov/search?ee=prod',
  'stay_in': '1',
  'commit': 'Log in'


response = requests.post('https://urs.earthdata.nasa.gov/login', headers=headers, cookies=cookies, data=data)


s = requests.Session()
s.post('https://urs.earthdata.nasa.gov/login', headers=headers, cookies=cookies, data=data)
response = s.get("https://asdc.larc.nasa.gov/data/AJAX/O3_1/2018/02/28/AJAX-O3_ALPHA_20180228_R1_F220.ict")
response
result = requests.get('https://asdc.larc.nasa.gov/data/AJAX/O3_1/2018/02/28/AJAX-O3_ALPHA_20180228_R1_F220.ict')
result.status_code
result.headers
content = result.content
soup = BeautifulSoup(content, features='lxml')
print(soup.prettify())

此打印功能将我引导至登录页面的 HTML 代码。有谁知道如何通过 Python 访问登录另一端的数据?

【问题讨论】:

在提交登录表单时,您是否在 POST 请求中尝试过 allow_redirects 标志? 我更新了response = requests.post('https://urs.earthdata.nasa.gov/login', headers=headers, cookies=cookies, data=data, allow_redirects=True)这一行,但程序仍然指向登录页面。 【参考方案1】:

data 中缺少一些内容,例如 authenticity_token 的值和 state 的编码值。以下是我将如何做到的。请确保在执行脚本之前相应地填写usernamepassword 字段。

import requests
from bs4 import BeautifulSoup

url = 'https://urs.earthdata.nasa.gov/oauth/authorize?splash=false&client_id=iQGRa5KtDl_e-fgYqB5x5Q&response_type=code&redirect_uri=https%3A%2F%2Fasdc.larc.nasa.gov%2Fdata%2Furs&state=aHR0cDovL2FzZGMubGFyYy5uYXNhLmdvdi9kYXRhL0FKQVgvTzNfMS8yMDE4LzAyLzI4L0FKQVgtTzNfQUxQSEFfMjAxODAyMjhfUjFfRjIyMC5pY3Q'
link = 'https://urs.earthdata.nasa.gov/login'

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
    r = s.get(url)
    soup = BeautifulSoup(r.text,"lxml")
    payload = i['name']:i.get('value','') for i in soup.select('input[name]')
    payload['username'] = 'your_username'
    payload['password'] = 'your_password'
    res = s.post(link,data=payload)
    print(res.text)

【讨论】:

我将它输入到我的 Jupyter Lab 会话中,在当前的设置中,它返回了身份验证代码以表明我已成功登录。为了访问身份验证页面后面的数据,我添加了以下行: res = s.get(url) 在当前 res 变量之后,这使我可以访问所需的数据。非常感谢!

以上是关于身份验证背后的 Web Scraper的主要内容,如果未能解决你的问题,请参考以下文章

HTTP基本身份验证背后的Django Rest框架

ALB + Okta SSO 身份验证背后的 AWS 托管 ElasticSearch(现在称为 OpenSearch) - 不可能吗?

如何使用 Web API 来对 MVC 应用程序进行身份验证

Undertow 是不是具有与 Tomcat Web 身份验证等效的 Web 层身份验证功能?

配置web服务基本用户身份验证,保证web站点的安全

如何使用 Web API 来对 MVC 应用程序进行身份验证