Как очистить данные с помощью расширяемых вкладок и последующих запросов POST (проблема CORS)

Есть сайт , который мне нужно парсить. Он имеет длинный список доступных вакансий, которые по умолчанию свернуты:

Которые разворачиваются, когда пользователь нажимает на них:

Когда пользователь разворачивает его, страница отправляет 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'))

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я не вижу дополнительных запросов, отправленных для получения расширенных данных. Все данные (как в свернутом, так и в развернутом состоянии уже находятся в исходном коде страницы)

response = requests.get('https://econjobmarket.org/positions').content
print("Post-Doc, Computational Marketing" in response)
True

Поверьте, оно есть. Если вы откроете консоль в Chrome и выберете раздел «Сеть», вы будете публиковать запросы, отправленные каждый раз, когда вы его расширяете.

Philipp Chapkovski 14.12.2020 14:41

Он есть, но он предназначен только для веб-аналитики и не возвращает никаких данных.

J. Darnell 14.12.2020 14:42

@PhilippChapkovski, да, я вижу XHR-запрос «recordClick», но я думаю, что он использовался только для статистики (так что сервер будет хранить информацию о том, сколько раз пользователь проверяет каждое описание вакансии)

Parolla 14.12.2020 14:43

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 просто записывает ваши действия на сайте.

Другие вопросы по теме