Как бороться с динамическими файлами cookie при сканировании веб-страниц

Я пытаюсь получить доступ к данным (значению цитаты) с веб-сайта электронной коммерции, используя библиотеку запросов в Python. У меня проблема в том, что файлы cookie на веб-сайте являются динамическими. И моему коду требуется заголовок для получения ответа. Я могу открыть веб-сайт и очистить его, но для этого мне нужно скопировать данные заголовка из заголовка ответа. Однако мне нужно автоматизировать этот процесс, чтобы мне не приходилось вручную вставлять файл cookie каждый раз, когда я хочу очистить данные. Это ссылка "https://www.nseindia.com/get-quotes/equity?symbol=RELIANCE". Я пытаюсь получить данные «Внутридневного графика», чтобы сохранить их в DataFrame и построить график.

Я новичок и никогда раньше не парсил веб-страницы.

Это то, что я пробовал до сих пор.

import requests
import pandas as pd

# I take this data from the website response headers

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'en-US,en;q=0.5',
    'Cookie' : 'Cookie Value'
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}

response = requests.get(url = 'https://www.nseindia.com/api/chart-databyindex?index=RELIANCEEQN', headers = headers)

response.json()['grapthData']

reliance = pd.DataFrame(response.json()['grapthData'])

reliance.columns = ['Timestamp', 'Price']

reliance['Timestamp'] = pd.to_datetime(reliance['Timestamp'], unit = 'ms' )

reliance.plot(x = 'Timestamp', y = 'Price')

105
1

Ответ:

Решено

Первый подход

Чтобы извлечь данные с веб-сайта с помощью динамических файлов cookie, вам необходимо автоматически обрабатывать файлы cookie и заголовки. Один из способов добиться этого — использовать библиотеку запросов вместе с запросами.Session для управления и сохранения файлов cookie для нескольких запросов. Кроме того, при необходимости вы можете использовать библиотеку BeautifulSoup для анализа содержимого HTML.

Вот более автоматизированный подход к обработке динамических файлов cookie и заголовков:

  • Используйте запросы.Session для поддержания сеанса.
  • Выполните первоначальный запрос, чтобы получить динамические файлы cookie.
  • Используйте эти файлы cookie для последующих запросов.

Пример:

import requests

# Initialize a session to handle cookies
session = requests.Session()

# Initial request to get the dynamic cookies
url = 'https://www.nseindia.com/get-quotes/equity?symbol=RELIANCE'
initial_response = session.get(url)

# Now make the actual request to get the intraday chart data
data_url = 'https://www.nseindia.com/api/chart-databyindex?index=RELIANCEEQN'
response = session.get(data_url)
   

Второй подход

Использование Selenium для автоматизации браузера и извлечения файлов cookie может быть эффективным подходом к обработке динамических файлов cookie. Вот как вы можете использовать Selenium, чтобы открыть веб-страницу, получить файлы cookie, а затем использовать эти файлы cookie в библиотеке запросов для получения необходимых данных.

pip install requests pandas selenium

Пример:

from selenium import webdriver
import requests
import pandas as pd
import time


# Initialize the Selenium WebDriver
driver = webdriver.Chrome()

# Open the URL using Selenium
url = 'https://www.nseindia.com/get-quotes/equity?symbol=RELIANCE'
driver.get(url)
time.sleep(5)

# Extract cookies from the Selenium browser session
cookies = driver.get_cookies()

# Close the Selenium browser
driver.quit()

# Create a dictionary of cookies for the requests session
cookies_dict = {cookie['name']: cookie['value'] for cookie in cookies}

# Initialize a session to handle cookies
session = requests.Session()

# Set the headers for the session
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'en-US,en;q=0.5',
    'X-Requested-With': 'XMLHttpRequest'
})

# Set the cookies for the session
session.cookies.update(cookies_dict)

# Make the actual request to get the intraday chart data
data_url = 'https://www.nseindia.com/api/chart-databyindex?index=RELIANCEEQN'
response = session.get(data_url)

Объяснение:

  1. Настройка Selenium: инициализация экземпляра Selenium WebDriver с помощью Chrome
  2. Открыть URL-адрес: перейдите к целевому URL-адресу с помощью Selenium.
  3. Извлечь файлы cookie: получить файлы cookie из сеанса Selenium.
  4. Управление сеансом: используйте запросы.Session для поддержания состояния сеанса. включая файлы cookie, извлеченные Selenium.
  5. Запрос данных: сделайте запрос к конечной точке API, используя сеанс. с правильными заголовками и файлами cookie.

Этот подход сочетает в себе возможности автоматизации Selenium с простотой и эффективностью библиотеки запросов для выполнения HTTP-запросов, гарантируя, что вы сможете обрабатывать динамические файлы cookie без ручного вмешательства.