Как бороться с динамическими файлами 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')
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скрейпинг становится все более популярным и сегодня является одной из актуальных тем в IT-сообществе. В результате несколько библиотек помогают...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
0
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 без ручного вмешательства.

Первый метод выдает мне ошибку: ConnectionError: («Соединение прервано.», RemoteDisconnected («Удаленное завершение закрытого соединения без ответа»)) А второй метод с использованием Selenium непоследовательно загружает котировки (цены) для акций. (Иногда цена акций отображается, иногда нет, я не знаю почему).

Spydernell 22.05.2024 12:34

Вы пробовали увеличить задержку? time.sleep(5)

Selfdev.py 22.05.2024 13:00

Да, я пробовал увеличить задержку. Я также пробовал запустить его в развернутом виде, «(useAutomationExtension, False)» и т. д. Тем не менее, это непоследовательно. Сканирование дает мне последовательное отображение диаграммы и котировок (цен), но я не уверен, как обращаться с динамическими файлами cookie.

Spydernell 22.05.2024 13:24

Добавление заголовков в первый предложенный вами сценарий должно исправить ошибку подключения @Selfdev.py.

SIM 22.05.2024 13:34

@Spydernell Да, я так думаю. Если он все равно не работает, то второй точно должен работать.

Selfdev.py 22.05.2024 14:38

Спасибо за помощь! Первый метод работает с заголовком (во втором методе использовался заголовок)

Spydernell 24.05.2024 07:16

Другие вопросы по теме