Не получается передать нужный запрос requests
Проблема такая - нужно пройтись по всем регионам сайта https://masterpotolkov.com/contacts/
Как правильно составить GET или POST запрос на питоне, чтобы возвращал разные регионы? Что нужно поместить в headers или data?
main_page=requests.get("https://spb.masterpotolkov.com/contacts/", headers=header)
Ответы (2 шт):
Название города указывается в самой ссылке, так что можно составить список городов и по ним получить ссылки
Пример:
import requests
from bs4 import BeautifulSoup
BASE_URL = 'https://{}masterpotolkov.com/contacts/'
for city in ['', 'dolgoprudny.', 'lyubertsy.', 'spb.']:
url = BASE_URL.format(city)
print(url)
rs = requests.get(url)
root = BeautifulSoup(rs.content, 'html.parser')
print(root.select_one('title').text)
print()
Результат:
https://masterpotolkov.com/contacts/
Контакты компании Мастер Потолков в Москве
https://dolgoprudny.masterpotolkov.com/contacts/
Контакты компании Мастер Потолков в Долгопрудном
https://lyubertsy.masterpotolkov.com/contacts/
Контакты компании Мастер Потолков в Люберцах
https://spb.masterpotolkov.com/contacts/
Контакты компании Мастер Потолков в Санкт-Петербурге
Если же мы не знаем какие города и всегда хотим иметь актуальные данные, тогда нужно смотреть как сайт обновляет регион при его смене на странице
Посмотрел и понял, что сайт явно не хранит ссылки на другие города, а отправляет POST запрос setRegion.php, что увидел на вкладке Сети. Остается повторить запрос для города, зная его id:
import requests
url = 'https://masterpotolkov.com/local/templates/mp/components/degres/regional/header_custom/ajax/setRegion.php'
place_id = 1452
data = {
'id': place_id,
'uri': '/',
'site_id': 'mp',
}
rs = requests.post(url, data=data)
print(rs.text)
# https://balashikha.masterpotolkov.com/
Теперь нужно узнать эти id, смотрим на сайте:

И пишем парсер, что вытащит их:
import time
import requests
from bs4 import BeautifulSoup
session = requests.Session()
def get_place_url(place_id) -> str:
url = 'https://masterpotolkov.com/local/templates/mp/components/degres/regional/header_custom/ajax/setRegion.php'
data = {
'id': place_id,
'uri': '/',
'site_id': 'mp',
}
rs = session.post(url, data=data)
return rs.text
rs = session.get('https://masterpotolkov.com')
root = BeautifulSoup(rs.content, 'html.parser')
for el in root.select('#region-select-container li > a[data-id]'):
place_id = el['data-id']
place_url = get_place_url(place_id)
print(f'{place_id} -> {place_url}')
time.sleep(0.1)
Результат:
1478 -> https://mo.masterpotolkov.com/
1450 -> https://masterpotolkov.com/
1452 -> https://balashikha.masterpotolkov.com/
1467 -> https://dolgoprudny.masterpotolkov.com/
1464 -> https://domodedovo.masterpotolkov.com/
1466 -> https://zhukovsky.masterpotolkov.com/
1462 -> https://zelenograd.masterpotolkov.com/
1477 -> https://kashira.masterpotolkov.com/
1457 -> https://korolev.masterpotolkov.com/
1465 -> https://krasnogorsk.masterpotolkov.com/
1455 -> https://lyubertsy.masterpotolkov.com/
1456 -> https://mytishchi.masterpotolkov.com/
1476 -> https://naro-fominsk.masterpotolkov.com/
1463 -> https://noginsk.masterpotolkov.com/
1460 -> https://odintsovo.masterpotolkov.com/
1451 -> https://podolsk.masterpotolkov.com/
1458 -> https://pushkino.masterpotolkov.com/
1453 -> https://ramenskoe.masterpotolkov.com/
1468 -> https://reutov.masterpotolkov.com/
1473 -> https://serpukhov.masterpotolkov.com/
1475 -> https://stupino.masterpotolkov.com/
1459 -> https://khimki.masterpotolkov.com/
1474 -> https://chekhov.masterpotolkov.com/
1454 -> https://shchelkovo.masterpotolkov.com/
1461 -> https://electrostal.masterpotolkov.com/
1469 -> https://spb.masterpotolkov.com/
1470 -> https://kaluga.masterpotolkov.com/
1472 -> https://maloyaroslavets.masterpotolkov.com/
1471 -> https://obninsk.masterpotolkov.com/