Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2017 16:30:31

trarbish
Зарегистрирован: 2017-05-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

Всем доброго дня!

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

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

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

У меня есть большие пробелы в знаниях. Есть возможность как-то самостоятельно посылать эти динамические запросы и пользоваться requests, чтобы ускорить парсинг?

Офлайн

#2 Май 31, 2017 18:13:04

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

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 для вставки в селект.
вообщем код там конечно отвратный.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Май 31, 2017 22:00:16

trarbish
Зарегистрирован: 2017-05-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

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 (Май 31, 2017 22:01:07)

Офлайн

#4 Май 31, 2017 23:47:19

trarbish
Зарегистрирован: 2017-05-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

И еще два похожих вопроса по другим сайтам:
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)? Или тут нет универсального совета, и каждый раз все по-разному? Что можно почитать, чтобы лучше понимать эту тему?

Отредактировано trarbish (Май 31, 2017 23:48:19)

Офлайн

#5 Июнь 1, 2017 05:10:36

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

В Chrome открываете “Инструменты разработчика”, вкладка Network, ставите фильтр по XHR, все запросы из жабаскриптов отображаются там. Ну а дальше пытаетесь понять ход мысли разработчиков сайта.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Июнь 1, 2017 05:20:14

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

trarbish
Сначала нужно выбрать регион, при клике на имя региона выполняется запрос https://www.perekrestok.ru/address/regionSiteList, который возвращает список регионов.
Кликаю на нужный регион, на странице появляются адреса магазинов. Но я не вижу, какой запрос отправляется, когда я кликаю на выбранный регион, чтобы это повторить в requests.
Там страница перегружается, чтобы увидеть запрос надо поставить галочку Preserve log и смотреть в фильтре Doc. Идентификатор региона передается в куке. Можно увидеть в запросе или вкладка Application, Storage -> Cookies, там видно region = N



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Июнь 1, 2017 05:33:16

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Июнь 1, 2017 22:59:10

trarbish
Зарегистрирован: 2017-05-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

PooH
В Chrome открываете “Инструменты разработчика”, вкладка Network, ставите фильтр по XHR, все запросы из жабаскриптов отображаются там. Ну а дальше пытаетесь понять ход мысли разработчиков сайта.
Да, я так обычно и делаю. Но вот оказывается надо много всего дополнительно проверять. И в source зайти и куки посмотреть. Как-то пока единой картины не складывается, от чего плясать и что проверять в первую очередь, а что потом.
Я еще прочитал, что вроде все события, которые связаны с выбранным элементом страницы, можно отслеживать в консоли с помощью monitorEvents($(‘selector’)). Но вот я попробовал на сайте магнита сделать:
monitorEvents($(‘#content > div.b-shops-list))
В скобках соответственно селектор блока, где появляются адреса. Как-то ничего не выводится в консоль, когда я меняю локацию…

Офлайн

#9 Июнь 1, 2017 23:01:56

trarbish
Зарегистрирован: 2017-05-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

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 еще можно посмотреть.

Отредактировано trarbish (Июнь 1, 2017 23:03:42)

Офлайн

#10 Июнь 2, 2017 01:11:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Парсинг сайта НЕ через Selenium

trarbish
Из этого у меня возник вопрос, как увидеть какие именно запросы выполняются на странице?
Тут писал.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version