#python #ajax #web-scraping
Вопрос:
Я пытаюсь получить информацию о ценах на различные металлы с веб-сайта, который показывает эту информацию бесплатно (https://www.wieland.com/en/metal-information#tab-general). Я достиг этого с помощью Python Selenium, но я знаю, что есть более эффективные способы (например, получение информации непосредственно из ответа AJAX). Я нашел информацию, которую я хочу получить с помощью инструментов разработки FireFox, но я не могу найти способ напрямую импортировать эту информацию в python.
Цель состоит в том, чтобы получить информацию о дате и цене в python, а затем создать фрейм данных с помощью Панд
Например, шаги, которые я выполнил, чтобы получить ответы AJAX, были:
Если бы кто-нибудь мог помочь мне в этой теме, я был бы признателен
Комментарии:
1. Я не вижу, чтобы эти запросы XHR создавались, когда я ввожу URL, который вы опубликовали. Что именно вы сделали, чтобы сгенерировать эти AJAX-запросы? Или, по крайней мере, укажите полный URL-адрес одного из этих запросов вместо изображения, показывающего частичный URL-адрес.
2. Спасибо за вашу быструю обратную связь, я обновил свой пост, показывающий, как были сгенерированы эти запросы AJAX. URL-адрес на самом деле не меняется в потоке процесса, который я сделал выше
Ответ №1:
Просмотр сетевых запросов для вышеупомянутого веб-сайта выглядит так, как будто нам нужно получить согласие на использование файлов cookie по другому URL-адресу, и для получения этих табличных данных Dataframe
мы будем использовать read_html
функцию pandas, а для отправки запроса мы будем использовать библиотеку запросов.
Редактировать их нет необходимости отправлять запрос на согласие на использование файлов cookie, без этого вы могли бы напрямую отправить запрос xhr.
import requests
from pandas import read_html
headers = {
'X-Requested-With': 'XMLHttpRequest'
}
querystring = {
"type": "general",
"method": "getDetails",
"language": "en",
"refKey": "2101",
"interval": "1",
"intervalStart": "09.01.2021",
"intervalEnd": "09.04.2021",
}
data = requests.get("https://www.wieland.com/en/ajax-metal-prices",headers=headers,params=querystring)
if data.status_code == 200:
table = read_html(data.json()["content"]["template"], attrs={"class": "metalinfo-table"})[0]
print(table)
else:
print("Some Issue")
переменная таблицы имеет свой Dataframe
для этой таблицы.
Выход:
Дайте мне знать, если у вас возникнут какие-либо вопросы 🙂
Комментарии:
1. Большое спасибо за ваш ответ! Это было очень полезно!! Однако, поскольку я только начал изучать веб-создание, я бы лучше ознакомился с этикой его использования. Например, в данном конкретном случае я планирую создать цикл, чтобы получить цены на Cu, Zn, Ni и т. Д., Но повлияет ли это как-то на веб-сайт?(Т. Е. Создаст слишком много трафика, что может привести к сбою)
2. обычно веб-сайты не будут терпеть неудачу, как это, так как я не думаю, что вы будете соскабливать чертовски много данных и захотите только часть из них, и даже соскабливать чертовски много данных, это выполнит его, поскольку он хранится в Интернете только для предоставления данных.