Найти - Пользователи
Полная версия: Парсинг сайта НЕ через Selenium
Начало » Python для новичков » Парсинг сайта НЕ через Selenium
1
trarbish
Всем доброго дня!

Вопрос по парсингу сайта с адресами торговых точек (хочу скачать соответственно все адреса):
http://magnit-info.ru/buyers/adds/1258/25/270

Проблема заключается в том, что адреса в выпадающем списке (также дублируются внизу страницы, класс .b-shops-list) выдаются только после выполнения запроса (видимо ajax). Соответственно с помощью requests у меня не получается вытянуть адреса (блок с классом .b-shops-list пустой до выполнения запроса). Собственно такая ситуация возникает много на каких сайтах, где используются яндекс или гугл карты.

Пока я сделал с помощью Selenium. Но работает очень долго! Пропарсить все районы и города, плюс закладываю 3-4 секунды, чтобы страница полностью загрузилась и выполнился запрос, занимает около 2 часов. Это уже с учетом того, что я это дело делаю в несколько процессов.

У меня есть большие пробелы в знаниях. Есть возможность как-то самостоятельно посылать эти динамические запросы и пользоваться requests, чтобы ускорить парсинг?
PooH
http://magnit-info.ru/functions/bmap/func.php методом POST отправляем форму
op:get_shops
SECTION_ID:1258
RID:25
CID:270
где
SECTION_ID Тип магазина
1257 Гипермаркеты Магнит
1258 Универсамы Магнит
1259 Магнит-Косметик

RID Регион
1389 Алтайский край
829 Архангельская область
22 Астраханская область
37 Белгородская область и т.д. выдирается из селекта на странице

CID Населенный пункт
281 Абинск и т.д. получаем GET запросом http://magnit-info.ru/functions/bmap/func.php?op=get_cities&ID=1389&SC=1259
где
SC = SECTION_ID Тип магазина
ID = RID Регион
прилетает в виде html, как опции для селекта

магазины прилетают в JSON, причем в одном из его атрибутов(sel) еще и дубликат в виде html для вставки в селект.
вообщем код там конечно отвратный.
trarbish
PooH
http://magnit-info.ru/functions/bmap/func.php методом POST отправляем формуop:get_shopsSECTION_ID:1258RID:25CID:270где SECTION_ID Тип магазина1257 Гипермаркеты Магнит1258 Универсамы Магнит1259 Магнит-КосметикRID Регион1389 Алтайский край829 Архангельская область22 Астраханская область37 Белгородская область и т.д. выдирается из селекта на страницеCID Населенный пункт281 Абинск и т.д. получаем GET запросом http://magnit-info.ru/functions/bmap/func.php?op=get_cities&ID=1389&SC=1259гдеSC = SECTION_ID Тип магазинаID = RID Регион прилетает в виде html, как опции для селектамагазины прилетают в JSON, причем в одном из его атрибутов(sel) еще и дубликат в виде html для вставки в селект.вообщем код там конечно отвратный.

Отлично, спасибо, я хоть почитал, как делать эти post и get запросы через requests. Прикладываю пример, вдруг кому пригодится:

 import requests
to_send = {
    'op': 'get_shops',
    'SECTION_ID': 1258,
    'RID': 22,
    'CID': 163,
}
result = requests.post('http://magnit-info.ru/functions/bmap/func.php', data=to_send)
addresses = result.json()
trarbish
И еще два похожих вопроса по другим сайтам:
1) https://www.perekrestok.ru/shops.
Сначала нужно выбрать регион, при клике на имя региона выполняется запрос https://www.perekrestok.ru/address/regionSiteList, который возвращает список регионов.
Кликаю на нужный регион, на странице появляются адреса магазинов. Но я не вижу, какой запрос отправляется, когда я кликаю на выбранный регион, чтобы это повторить в requests.
2) https://5ka.ru/stores/
С этим сайтом вопрос следующего плана. Адреса магазинов можно вернуть сделав такой запрос:
https://5ka.ru/api/stores/?type=bbox=1.7535,1.1563,100.3476,100.0781
Этот запрос был найден не в Network, а в Sources. Из этого у меня возник вопрос, как увидеть какие именно запросы выполняются на странице? Надо смотреть всегда и Network и Sources? Какой алгоритм действий, когда я вижу, что информация на странице подгружается динамически, и я хочу узнать, как именно она подгружается (какой запрос используется, чтобы я мог это повторить через тот же requests)? Или тут нет универсального совета, и каждый раз все по-разному? Что можно почитать, чтобы лучше понимать эту тему?
PooH
В Chrome открываете “Инструменты разработчика”, вкладка Network, ставите фильтр по XHR, все запросы из жабаскриптов отображаются там. Ну а дальше пытаетесь понять ход мысли разработчиков сайта.
PooH
trarbish
Сначала нужно выбрать регион, при клике на имя региона выполняется запрос https://www.perekrestok.ru/address/regionSiteList, который возвращает список регионов.
Кликаю на нужный регион, на странице появляются адреса магазинов. Но я не вижу, какой запрос отправляется, когда я кликаю на выбранный регион, чтобы это повторить в requests.
Там страница перегружается, чтобы увидеть запрос надо поставить галочку Preserve log и смотреть в фильтре Doc. Идентификатор региона передается в куке. Можно увидеть в запросе или вкладка Application, Storage -> Cookies, там видно region = N
PooH
trarbish
2) https://5ka.ru/stores/
С этим сайтом вопрос следующего плана. Адреса магазинов можно вернуть сделав такой запрос:
https://5ka.ru/api/stores/?type=bbox=1.7535,1.1563,100.3476,100.0781
Вообще то на вкладке XHR https://5ka.ru/api/stores/around/?lat=55.794436&lon=37.545276&radius=15&active=true
где видим lat и lon очевидно широта и долгота точки, radius - радиус окружности поиска, active видимо отфильтровать работающие. О , кстати прикольно, там django rest framework
trarbish
PooH
В Chrome открываете “Инструменты разработчика”, вкладка Network, ставите фильтр по XHR, все запросы из жабаскриптов отображаются там. Ну а дальше пытаетесь понять ход мысли разработчиков сайта.
Да, я так обычно и делаю. Но вот оказывается надо много всего дополнительно проверять. И в source зайти и куки посмотреть. Как-то пока единой картины не складывается, от чего плясать и что проверять в первую очередь, а что потом.
Я еще прочитал, что вроде все события, которые связаны с выбранным элементом страницы, можно отслеживать в консоли с помощью monitorEvents($(‘selector’)). Но вот я попробовал на сайте магнита сделать:
monitorEvents($(‘#content > div.b-shops-list))
В скобках соответственно селектор блока, где появляются адреса. Как-то ничего не выводится в консоль, когда я меняю локацию…
trarbish
PooH
Вообще то на вкладке XHR https://5ka.ru/api/stores/around/?lat=55.794436&lon=37.545276&radius=15&active=true
По этому запросу не выводятся адреса магазинов, там только координаты. Плюс если поменять радиус с 15 на 10000, то ничего не изменится.
По запросу, который содержится в соурс:
https://5ka.ru/api/stores/?type=bbox=1.7535,1.1563,100.3476,100.0781
можно получить именно все адреса

А XHR я весь проверил, и так и не нашел подходящего запроса. Это мне потом умные люди подсказали, что в source еще можно посмотреть.
py.user.next
trarbish
Из этого у меня возник вопрос, как увидеть какие именно запросы выполняются на странице?
Тут писал.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB