Как использовать запросы Python для заполнения параметра даты, а также загрузки из radiobutton

#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)
  

Попробуйте это repl.it

Комментарии:

1. Откуда вы получили URL-адрес отчета о потоке? Я не вижу его на вкладке Сеть.