Использование python запросов для публикации - Как получить правильные данные таблицы, которые я запрашиваю? - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь получить исторические данные c календаря с этого сайта - https://www.investing.com/economic-calendar/ за следующие даты (с 1 февраля 2020 года по 5 февраля 2020 года).

Сегодня 4 февраля 2020 года.

Если я использую URL-адрес https://www.investing.com/economic-calendar/ ниже, я могу извлечь таблицу с помощью Beautifulsoup, но не могу выбрать любой день, кроме текущего. Я получаю таблицу, сохраненную в моем сценарии python для (4 февраля 2020 года), который сегодня.

import requests
import pandas as pd
from bs4 import BeautifulSoup

payload = {"country[]":["25","32","6","37","72","22","17","39","14","10","35","43","56","36","110","11","26","12","4","5"],
                "dateFrom":"2020-02-01",
                "dateTo":"2020-02-05",
                "timeZone":"8",
                "timeFilter":"timeRemain",
                "currentTab":"custom",
                "limit_from":"0"}

urlheader = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}

url = "https://www.investing.com/economic-calendar/"

req = requests.post(url, data=payload, headers=urlheader)
print(req)
soup = BeautifulSoup(req.content, "lxml")
table = soup.find('table', id="economicCalendarData")

Переменная таблицы выглядит следующим образом table variable

Я вижу, что он отправляет почтовый запрос на "https://www.investing.com/economic-calendar/Service/getCalendarFilteredData" всякий раз, когда я изменяю диапазон дат или настройки фильтра.

Вот данные запроса, которые я нашел.

request data

Вот ссылка POST

post link

Поэтому вместо этого я использую следующий код , так как я хочу выбрать даты.

import requests
import pandas as pd
from bs4 import BeautifulSoup

payload = {"country[]":["25","32","6","37","72","22","17","39","14","10","35","43","56","36","110","11","26","12","4","5"],
                "dateFrom":"2020-02-01",
                "dateTo":"2020-02-05",
                "timeZone":"8",
                "timeFilter":"timeRemain",
                "currentTab":"custom",
                "limit_from":"0"}

urlheader = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}

url = "https://www.investing.com/economic-calendar/Service/getCalendarFilteredData"

req = requests.post(url, data=payload, headers=urlheader)
print(req)
soup = BeautifulSoup(req.content, "lxml")
table = soup.find('table', id="economicCalendarData")

Но на этот раз не используется financialCalendarData, поэтому переменная таблицы выходит пустой. Переменная супа содержит данные, но в ней нет данных таблицы.

Это таблица, которую я пытаюсь сохранить.

table to save

Как я уже говорил ранее, если я использую URL в качестве https://www.investing.com/economic-calendar/, я могу получить данные таблицы только за текущий день (4 февраля 2020 года); независимо от того, какие даты я ввожу в полезную нагрузку (dateFrom, dateTo).

По какой-то причине таблица появляется пустой, когда я пытаюсь опубликовать вместо нее https://www.investing.com/economic-calendar/Service/getCalendarFilteredData, хотя Переменная супа содержит данные, это не те данные, которые я запрашиваю. Что я делаю неправильно? Как сохранить таблицы на выбранные даты?

1 Ответ

2 голосов
/ 04 февраля 2020

Вы были очень близко. Если я поняла ваши требования, вас должно найти следующее:

import requests
from bs4 import BeautifulSoup

url = "https://www.investing.com/economic-calendar/Service/getCalendarFilteredData"

payload = {"country[]":["25","32","6","37","72","22","17","39","14","10","35","43","56","36","110","11","26","12","4","5"],
                "dateFrom":"2020-02-01",
                "dateTo":"2020-02-05",
                "timeZone":"8",
                "timeFilter":"timeRemain",
                "currentTab":"custom",
                "limit_from":"0"}

req = requests.post(url, data=payload, headers={
    "User-Agent":"Mozilla/5.0",
    "X-Requested-With": "XMLHttpRequest"
    })
soup = BeautifulSoup(req.json()['data'],"lxml")
for items in soup.select("tr"):
    data = [item.get_text(strip=True) for item in items.select("th,td")]
    print(data)
...