Есть сайт , который мне нужно парсить. Он имеет длинный список доступных вакансий, которые по умолчанию свернуты:
Которые разворачиваются, когда пользователь нажимает на них:
Когда пользователь разворачивает его, страница отправляет POST-запрос на веб-сайт с идентификатором позиции.
Я попытался сымитировать этот запрос (см. код ниже), он не терпит неудачу (статус == 200), но ничего не возвращает. Я подозреваю, что это из-за CORS. Можно ли как-то еще собирать данные?
import requests
url = "https://econjobmarket.org/positions/recordClick"
payload = 'posid=7026'
headers = {
'Accept': '*/*',
'X-CSRF-TOKEN': HERE_GOES_THE_TOKEN,
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': HERE_GOES_THE_COOKIE
}
response = requests.request("POST", url, headers=headers, data = payload)
print(response.text.encode('utf8'))
Я не вижу дополнительных запросов, отправленных для получения расширенных данных. Все данные (как в свернутом, так и в развернутом состоянии уже находятся в исходном коде страницы)
response = requests.get('https://econjobmarket.org/positions').content
print("Post-Doc, Computational Marketing" in response)
True
Он есть, но он предназначен только для веб-аналитики и не возвращает никаких данных.
@PhilippChapkovski, да, я вижу XHR-запрос «recordClick», но я думаю, что он использовался только для статистики (так что сервер будет хранить информацию о том, сколько раз пользователь проверяет каждое описание вакансии)
URL-адрес recordClick, который вы видите, просто предназначен для записи кликов для веб-аналитики. Как сказал Паролла, то, что вы ищете, уже есть в исходном коде страницы. Лучше всего выполнить HTTP GET на веб-сайте и проанализировать html-код с помощью BeautifulSoup.
Вы можете уменьшить способность сайта отслеживать вас и потенциально заблокировать ваш парсинг, если вы удалите токен и файлы cookie из заголовков запроса.
Быстрый тест в curl показывает, что без них ответ по-прежнему полный.
curl -i -s -k -X $'GET' \
-H $'Host: econjobmarket.org' -H $'Connection: close' -H $'Cache-Control: max-age=0' -H $'DNT: 1' -H $'Upgrade-Insecure-Requests: 1' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' -H $'Sec-GPC: 1' -H $'Sec-Fetch-Site: cross-site' -H $'Sec-Fetch-Mode: navigate' -H $'Sec-Fetch-User: ?1' -H $'Sec-Fetch-Dest: document' -H $'Accept-Encoding: gzip, deflate' -H $'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' \
$'https://econjobmarket.org/positions'
Джей и Паролла правы в том, что POST просто записывает ваши действия на сайте.
Поверьте, оно есть. Если вы откроете консоль в Chrome и выберете раздел «Сеть», вы будете публиковать запросы, отправленные каждый раз, когда вы его расширяете.