Есть ли способ загрузить CSV-файл из «щелчка кнопки веб-сайта» с помощью Python? - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу автоматизировать загрузку файла CSV "Projects.csv" с этого веб-сайта:

https://www.vcsprojectdatabase.org/#/projects/st_/c_/ss_0/so_/di_/np_

Файл CSV можно загрузить вручную, щелкнув значок CSV, но яЯ не уверен, как я могу автоматизировать эту загрузку в Python и локально сохранить файл CSV на моем диске.

До сих пор я пытался проверить элемент кнопки через консоль разработчика Chrome, чтобы найти правильный URL-адрес на вкладке Сеть.как так ?:

'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport'

Но я не уверен, должен ли этот URL включать имя файла в конце, например:

' https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport/Projects.csv'

Это то, что я пробовал, но он просто пишет пустой файл:


import requests

url = 'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport/Projects.csv'

r = requests.get(url)
with open('a.csv', 'wb') as f:
    f.write(r.content) 

Как мне получить файл CSV для правильной загрузки и сохранения?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Прежде всего, вы должны понимать, что протокол HTTP основан на запросах .Конечным результатом выполнения JavaScript будет сформированный HTTP-запрос, который позволит серверу ответить содержимым файла.Вам нужно «перевернуть» веб-страницу, найти способ создания правильного запроса и повторить его как можно точнее.

Итак, давайте попробуем сделать это шаг за шагом:

  1. Щелкните правой кнопкой мыши по элементу, который выполняет загрузку, и нажмите «Проверить элемент» enter image description here
  2. В исходном коде вы можете увидеть название функции JavaScript, которую выполняет этот элемент enter image description here
  3. Введите имя функции в консоли без скобок и нажмите кнопку, которая должна появиться рядом с возвратом консоли (эта кнопка откроет эту функцию JavaScript в исходном коде) enter image description here
  4. В исходном коде мы видим, что функция execute submit в HTML-элементе с идентификатором frmDownload.Итак, вернитесь на вкладку «Инспектор» и введите этот идентификатор в поле поиска.enter image description here
  5. Теперь мы обнаружили, что этот элемент имеет форму HTML .Эта форма отправляет POST запрос на URL https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport со следующими данными:

    searchTerm=
    country=
    sectoral_scope=0
    recentProjects=
    sort=projectId
    dir=DESC
    formatType=csv
    

    Этой информации достаточно, чтобы попытаться повторить этот запрос в Python.

Давайте напишем небольшой скрипт, который формирует и отправляет тот же запрос и сохраняет результат в файл .csv:

import requests

data = {
    "searchTerm": "",
    "country": "",
    "sectoral_scope": "0",
    "recentProjects": "",
    "sort": "projectId",
    "dir": "DESC",
    "formatType": "csv"
}

file = requests.post("https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport", data)

with open("res.csv", "wb+") as f:
    f.write(file.content)

Запустите его, и оно ... работает.res.csv содержит правильный результат.

НО ЭТО НЕ ВСЕ. Обычно все не так просто.Чтобы наш запрос выглядел так же, как отправленный браузером, нам нужно взглянуть на заголовки запроса .Чтобы захватить HTTP-запрос из браузера, мы можем открыть вкладку «Сеть»:

enter image description here

Теперь давайте нажмем кнопку загрузки на веб-странице и загрузим CSV-файл.В таблице запросов теперь мы можем увидеть наш почтовый запрос.Нажмите на него и посмотрите вкладку «Заголовки» в разделе «Запрос заголовков».

enter image description here

Есть заголовок Cookie ,который в основном в таких запросах не важен и может быть пропущен.Но если у вас есть какие-то проблемы с запросом, вы должны просмотреть предыдущие запросы, найти запрос с заголовком Set-Cookie в ответе сервера и повторить его.

Давайте улучшим наш скрипт и скопируем важный (Host,Content-Length, Connection мы не включаем, потому что модуль запросов Python будет добавлять их автоматически, DNT и Upgrade-Insecure-Requests вообще не нужны) заголовки из браузера.

import requests

data = {
    "searchTerm": "",
    "country": "",
    "sectoral_scope": "0",
    "recentProjects": "",
    "sort": "projectId",
    "dir": "DESC",
    "formatType": "csv"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language":  "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.vcsprojectdatabase.org/",
    "Content-Type": "application/x-www-form-urlencoded"
}

file = requests.post("https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport", data,
                     headers=headers)

with open("res.csv", "wb+") as f:
    f.write(file.content)

PS Не забудьте попросить разрешения у владельца сайта 1080

0 голосов
/ 30 апреля 2019

Тип запроса - POST, и вам нужно указать соответствующие заголовки, которые вы можете увидеть в консоли разработчика.Кроме того, вы не будете предоставлять данные формы.Приведенный ниже код работает.

import requests

url = 'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport?searchTerm=&country=&sectoral_scope=0&recentProjects=&sort=projectId&dir=DESC&formatType=csv'
headers = {'Content-Type': 'application/x-www-form-urlencoded','Accept': 'text/csv'}

r = requests.post(url,headers=headers)
with open('a.csv', 'wb') as f:
    f.write(r.content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...