Browser requests to code – Hamel’s Blog - Hamel Husain
Заметка Hamel Husain описывает приём веб-скрапинга: вместо парсинга HTML можно превратить сетевые запросы браузера в готовый код. Автор узнал этот трюк из доклада Zachary Blackwood на NormConf 2022. На примере поиска ресторанов Subway показано, как через DevTools Chrome найти нужный сетевой запрос (GetLocations.ashx), скопировать его как cURL и вставить на curlconverter.com, чтобы получить Python-код, обращающийся к недокументированному API. Дополнительно показан хакерский способ распарсить ответ через json.loads и извлечь данные о магазинах. Подход хорош для разовых задач, но для повторяемого скрапинга лучше использовать headless-браузер.
Я узнал об этом из доклада Zachary Blackwood на NormConf в 2022 году.
Пример: получаем список ресторанов Subway с помощью Python
Откройте https://www.subway.com/en-US/locator в Google Chrome
Откройте инструменты разработчика с помощью Option + CMD + I. Перейдите на вкладку Network и нажмите кнопку очистки.
Введите почтовый индекс и выполните поиск. Найдите сетевой запрос, который, похоже, получает данные — в данном случае GetLocations.ashx... выглядит очень многообещающе.
Щёлкните правой кнопкой по этому событию и выберите Copy -> Copy as Curl.
Перейдите на curlconverter.com и вставьте туда команду curl.
Наслаждайтесь Python-кодом, который использует этот в остальном недокументированный API :)
Бонус: парсинг ответа
Данные ответа можно распарсить хакерским способом.
# запустите код с curlconverter.com, который даст вам объект `response`. >>> import json ... response_string = response.text ... json_string = response_string[response_string.index("(") +1:response_string.index('"AdditionalData":')-1]+'}' ... parsed_string = json.loads(json_string) ... stores = parsed_string['ResultData'] >>> stores [{'LocationId': {'StoreNumber': 21809, 'SatelliteNumber': 0}, 'Address': {'Address1': '4888 NW Bethany Blvd', 'Address2': 'Suite K-1', 'Address3': 'Bethany Village Centre', 'City': 'Portland', 'StateProvCode': 'OR', 'PostalCode': '97229', 'CountryCode': 'US', 'CountryCode3': 'USA'}, 'Geo': {'Latitude': 45.5548, 'Longitude': -122.8358, 'TimeZoneId': 'America/Los_Angeles', 'CurrentUtcOffset': 0}, 'ListingNumber': 1, 'OrderingUrl': 'http://order.subway.com/Stores/Redirect.aspx?s=21809&sa=0&f=r&scc=US&spc=OR', 'CateringUrl': 'https://www.ezcater.com/catering/pvt/subway-portland-nw-bethany-blvd', 'ExtendedProperties': None}, ...
Когда использовать этот подход
Это отлично подходит для разовых задач, но если вы хотите делать это воспроизводимо, лучше использовать headless-браузер и действительно скрапить HTML. Однако часто нужен именно одноразовый скрап — и тогда это совсем неплохой вариант!