Прежде всего, вы должны понимать, что протокол HTTP основан на запросах .Конечным результатом выполнения JavaScript будет сформированный HTTP-запрос, который позволит серверу ответить содержимым файла.Вам нужно «перевернуть» веб-страницу, найти способ создания правильного запроса и повторить его как можно точнее.
Итак, давайте попробуем сделать это шаг за шагом:
- Щелкните правой кнопкой мыши по элементу, который выполняет загрузку, и нажмите «Проверить элемент»
- В исходном коде вы можете увидеть название функции JavaScript, которую выполняет этот элемент
- Введите имя функции в консоли без скобок и нажмите кнопку, которая должна появиться рядом с возвратом консоли (эта кнопка откроет эту функцию JavaScript в исходном коде)
- В исходном коде мы видим, что функция execute submit в HTML-элементе с идентификатором
frmDownload
.Итак, вернитесь на вкладку «Инспектор» и введите этот идентификатор в поле поиска. Теперь мы обнаружили, что этот элемент имеет форму 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-запрос из браузера, мы можем открыть вкладку «Сеть»:
Теперь давайте нажмем кнопку загрузки на веб-странице и загрузим CSV-файл.В таблице запросов теперь мы можем увидеть наш почтовый запрос.Нажмите на него и посмотрите вкладку «Заголовки» в разделе «Запрос заголовков».
Есть заголовок 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