#python #web-scraping #python-requests
#python #веб-очистка #python-запросы
Вопрос:
Я пытаюсь создать скрипт на python, который будет очищать данные с этого веб-сайта
https://noms.wei-pipeline.com/reports/ci_report/launch.php?menuitem=2600315
и загрузите CSV со вчерашнего дня. Как вы можете видеть, в нем есть два пункта меню для дат, переключатель для CSV, а затем кнопка отправки.
Я подумал, что, возможно, я мог бы использовать библиотеку запросов? Не ищу, чтобы кто-то сделал это за меня, но если бы кто-нибудь мог указать мне правильное направление, это было бы здорово!
Я знаю, что это слишком просто, но вот что у меня есть до сих пор:
import requests
print('Download Starting...')
url = 'https://noms.wei-pipeline.com/reports/ci_report/launch.php?menuitem=2600315'
r = requests.get(url)
filename = url.split('/')[-1] # this will take only -1 splitted part of the url
with open(filename,'wb') as output_file:
output_file.write(r.content)
print('done')
Ответ №1:
Сначала вам нужно использовать requests.Session()
для сохранения файлов cookie и повторной отправки их в последующих запросах. Процесс заключается в следующем :
-
сначала получите исходный URL-адрес, чтобы получить файлы cookie (идентификатор сеанса)
-
сделайте запрос
POST /reports/ci_report/server/request.php
с некоторыми параметрами, включая дату и формат вывода. Результатом является json с идентификатором, подобным этому :{'jrId': 'jr_13879611'}
-
сделайте запрос, по
GET /reports/ci_report/server/streamReport.php?jrId=jr_13879611
которому будут предоставлены данные csv
В запросе POST есть параметр, в котором нам нужно значение параметра запроса menuitem из вашего исходного URL, поэтому мы анализируем параметры запроса, чтобы получить его с помощью urlparse
:
import requests
import time
import urllib.parse as urlparse
from urllib.parse import parse_qs
from datetime import datetime,timedelta
yesterday = datetime.now() - timedelta(1)
yesterday_date = f'{yesterday.strftime("%d")}-{yesterday.strftime("%B")[:3]}-{yesterday.strftime("%Y")}'
original_url = "https://noms.wei-pipeline.com/reports/ci_report/launch.php?menuitem=2600315"
parsed = urlparse.urlparse(original_url)
target_url = "https://noms.wei-pipeline.com/reports/ci_report/server/request.php"
stream_report_url = "https://noms.wei-pipeline.com/reports/ci_report/server/streamReport.php"
s = requests.Session()
# load the cookies
s.get(original_url)
#get id
r = s.post(target_url,
params = {
"request.preventCache": int(round(time.time() * 1000))
},
data = {
"ReportProc": "CIPR_DAILY_BULLETIN",
"p_ci_id": parse_qs(parsed.query)['menuitem'][0],
"p_opun": "PL",
"p_gas_day_from": yesterday_date,
"p_gas_day_to": yesterday_date,
"p_output_option": "CSV"
})
r = s.get(stream_report_url, params = r.json())
print(r.text)
Комментарии:
1. Откуда вы получили URL-адрес отчета о потоке? Я не вижу его на вкладке Сеть.