Поскольку веб-сайт использует Ajax и библиотеку JavaScript для заполнения таблицы на странице, самый простой способ получить нужные данные - это реплицировать запрос Ajax.
Данные JSON с сервера имеют следующую структуру:
{
"value": {
"draw": "-1",
"recordsTotal": 1476,
"recordsFiltered": 1476,
"data": [{
"DT_RowClass": "even",
"0": "<a href=\"/at.gv.bmdw.eproc-p/public/de_AT/tenderlist?action=view&object=41a809d9-0b61-4991-86b8-74dc07973af3-15ed14df-d91c-4905-94fd-e1d7935eaef1\">Planung Freiland/Brücke</a>",
"1": "Autobahnen- und Schnellstraßen-Finanzierungs-Aktiengesellschaft",
"2": "08.04.2019",
"3": null
}, {
"DT_RowClass": "odd",
"0": "<a href=\"/at.gv.bmdw.eproc-p/public/de_AT/tenderlist?action=view&object=86dd87bd-7426-40c5-946b-62b2af638aab-7a54478b-9e89-4d47-bdf8-dc8b867c57b8\">Lieferung von Erdgas 2020 - 2022</a>",
"1": "Republik Österreich (Bund), Bundesbeschaffung GmbH sowie alle weiteren Auftraggeber gemäß der den Ausschreibungsunterlagen beiliegenden Drittkundenliste, im Vergabeverfahren alle vertreten durch die Bundesbeschaffung GmbH",
"2": "08.04.2019",
"3": "07.05.2019"
}]
}
}
Далее используется модуль requests
для извлечения JSON с сервера и самый маленький HTML-анализатор для извлечения текста из ссылок. Вы можете использовать BeautifulSoup для той же цели.
import requests
from html.parser import HTMLParser
class TinyTextExtractor(HTMLParser):
def parse(self, html):
self.text = ''
self.feed(html)
return self.text
def handle_data(self, data):
self.text += data
def get_ausschreibungen(start=0, length=25):
url = 'https://ausschreibungen.usp.gv.at/at.gv.bmdw.eproc-p/ajax/dataTablesTenderList'
resp = requests.get(url, {
'start': start,
'length': length
})
parser = TinyTextExtractor()
for row in resp.json()['value']['data']:
yield {
'Bezeichnung': parser.parse(row['0']),
'Organisation': row['1'],
'Veröffentlicht': row['2'],
'Frist': row['3'],
}
Использование:
for item in get_ausschreibungen(0, 3):
print(item)
Что печатает это для меня:
{'Bezeichnung': 'Planung Freiland/Brücke', 'Organisation': 'Autobahnen- und Schnellstraßen-Finanzierungs-Aktiengesellschaft', 'Veröffentlicht': '08.04.2019', 'Frist': None}
{'Bezeichnung': 'Lieferung von Erdgas 2020 - 2022', 'Organisation': 'Republik Österreich (Bund), Bundesbeschaffung GmbH sowie alle weiteren Auftraggeber gemäß der den Ausschreibungsunterlagen beiliegenden Drittkundenliste, im Vergabeverfahren alle vertreten durch die Bundesbeschaffung GmbH', 'Veröffentlicht': '08.04.2019', 'Frist': '07.05.2019'}
{'Bezeichnung': 'Umbau Bahnhof Villach ', 'Organisation': 'ÖBB-Personenverkehr AG', 'Veröffentlicht': '08.04.2019', 'Frist': None}
Я уверен, что фильтрация / превращение его в CSV больше не проблема.
Используйте инструменты разработчика браузера (F12), чтобы выяснить, какие другие параметры запроса отправляются и имеют ли они отношение к вам. Вы также можете попробовать "смешать", используя функцию Session модуля requests
, реплицирующую все заголовки HTTP и куки, но, учитывая, что это похоже на правительственный сайт, они, вероятно, не будут возражать, что вы их очищаете.