автоматизировать загрузку файла CSV со случайного URL-адреса с Python - PullRequest
1 голос
/ 04 августа 2020

Используя Pandas в Python, я хочу загрузить файл csv с этого веб-сайта, но ссылка для загрузки содержит некоторые случайные символы, поэтому я хочу знать, как это автоматизировать.

Это данные финансовой торговли, которые обновляются каждый день. Файл csv, который я хочу загрузить, находится в красном квадрате в верхнем ряду. Каждый день вверху добавляется новая строка, и я хочу автоматизировать загрузку этого csv.

введите описание изображения здесь

Мой план состоял в том, чтобы автоматически импортировать csv в pandas в Python, динамически создавая строку url с использованием даты дня. Пример URL-адреса выглядит так:

https://www.jpx.co.jp/markets/derivatives/participant-volume/nlsgeu000004vd5b-att/20200731_volume_by_participant_whole_day.csv

А вот мой Python скрипт.

from datetime import datetime as dt
day = dt.today()
date = str(day.year) + '{:02d}'.format(day.month) + '{:02d}'.format(day.day)
url = 'https://www.jpx.co.jp/markets/derivatives/participant-volume/nlsgeu000004vd5b-att/%s_volume_by_participant_whole_day_J-NET.csv' %date
# Followed by pandas...

Проблема в том, что это часть этого url (nlsgeu000004vgi7-att) всегда представляет собой случайную последовательность символов, и я не могу динамически запрашивать ее. Например, 7/30, это часть nlsgeu000004vd5b-att. По крайней мере, я не знаю, каково правило для создания этой строки.

Есть ли способ правильно указать на такой частично случайный URL? Я придумал обходные пути, но понятия не имел, как их реализовать. Было бы здорово, если бы вы мне помогли! Пока я могу автоматически загружать csv, все в порядке!

  • с использованием регулярных выражений
  • с использованием парсера, такого как BeautifulSoup, чтобы получить URL-адрес любого csv в верхней строке

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Да, если вы не знаете, как создается URL-адрес, вам нужно очистить страницу, чтобы найти его. Вот быстрый пример использования BeautifulSoup с фильтром регулярных выражений для поиска первой ссылки на этой странице, которая включает volume_by_participant_whole_day.csv в URL-адресе:

import re
import requests
from bs4 import BeautifulSoup

base_url = "https://www.jpx.co.jp"
data = requests.get(f"{base_url}/markets/derivatives/participant-volume/archives-01.html")
parsed = BeautifulSoup(data.text, "html.parser")
link = parsed.find("a", href=re.compile("volume_by_participant_whole_day.csv"))
path = link["href"]
print(f"{base_url}{path}")
0 голосов
/ 04 августа 2020

Я написал код, который будет напрямую получать ссылку на этот конкретный файл Excel. Я не использовал какое-либо регулярное выражение, мой ответ основан на позиции этого элемента, поэтому вы можете просто получить ссылку, запустив его.

перед запуском кода убедитесь, что у вас есть запросы и модули BeautifulSoup

если нет, то это инструкции по установке

# for requests module
pip install requests

# for beautifulsoup module
pip install beautifulsoup4

BS Script

# Imports
import requests
from bs4 import BeautifulSoup as bs

# Requesting and extracting html code
html_source = requests.get('https://www.jpx.co.jp/markets/derivatives/participant-volume/archives-01.html').text

# converting html to bs4 object
soup = bs(html_source, 'html.parser')

# finding all the table rows columns
trs = soup.find_all('tr')

# selecting 3rd row
x = [i for i in trs[2]]

# selecting 4th cell and then 2nd item(1st item is the pdf one)
y = [i for i in x[7]][2]

excel_file_link = y.get('href')

print(excel_file_link)
0 голосов
/ 04 августа 2020

Я бы очистил сайт, как вы предлагали. Похоже, что это было бы очень легко сделать (если эти элементы не генерируются динамически с использованием javascript) и устранит возможные будущие проблемы, которые могут возникнуть с регулярным выражением, если вы неправильно предположите шаблон URL:

  1. Используйте запрос GET для извлечения html со страницы (используйте requests)
  2. Используйте BeautifulSoup для извлечения нужного URL-адреса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...