newsmode
search
Меню
arrow_back Назад

Browser requests to code – Hamel’s Blog - Hamel Husain

auto_awesomeКраткое саммари

Заметка Hamel Husain описывает приём веб-скрапинга: вместо парсинга HTML можно превратить сетевые запросы браузера в готовый код. Автор узнал этот трюк из доклада Zachary Blackwood на NormConf 2022. На примере поиска ресторанов Subway показано, как через DevTools Chrome найти нужный сетевой запрос (GetLocations.ashx), скопировать его как cURL и вставить на curlconverter.com, чтобы получить Python-код, обращающийся к недокументированному API. Дополнительно показан хакерский способ распарсить ответ через json.loads и извлечь данные о магазинах. Подход хорош для разовых задач, но для повторяемого скрапинга лучше использовать headless-браузер.

I learned this from Zachary Blackwood’s 2022 NormConf Talk.

Я узнал об этом из доклада Zachary Blackwood на NormConf в 2022 году.

Example: Get A List of Subway Restaurants With Python

Пример: получаем список ресторанов Subway с помощью Python

  • Go to https://www.subway.com/en-US/locator in Google Chrome
  • Откройте https://www.subway.com/en-US/locator в Google Chrome

  • Open developer tools using Option + CMD + I

  • Go the the network tab, and hit the clear button

  • Откройте инструменты разработчика с помощью Option + CMD + I. Перейдите на вкладку Network и нажмите кнопку очистки.

  • Type in a zipcode and search. Look for a network request that seems like it is getting data, in this case GetLocations.ashx... looks super promising.
  • Введите почтовый индекс и выполните поиск. Найдите сетевой запрос, который, похоже, получает данные — в данном случае GetLocations.ashx... выглядит очень многообещающе.

  • Right click on that particular event and select Copy -> Copy as Curl
  • Щёлкните правой кнопкой по этому событию и выберите Copy -> Copy as Curl.

  • Go to curlconverter.com and paste the curl command there.
  • Перейдите на curlconverter.com и вставьте туда команду curl.

    Enjoy your python code that uses this otherwise undocumented API :)

    Наслаждайтесь Python-кодом, который использует этот в остальном недокументированный API :)

    Bonus: Parse The Response

    Бонус: парсинг ответа

    You can parse the response data in a hacky way.

    Данные ответа можно распарсить хакерским способом.

    # run the code from curlconverter.com, which will give you a `response` object. >>> 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}, ...

    # запустите код с 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}, ...

    When to use this approach

    Когда использовать этот подход

    This is great for adhoc things, but you probably want to use a headless browser and actually scrape the HTML if you want to do this in a repeatable way. But many times you want to do a one-off scrape, this isn’t so bad!

    Это отлично подходит для разовых задач, но если вы хотите делать это воспроизводимо, лучше использовать headless-браузер и действительно скрапить HTML. Однако часто нужен именно одноразовый скрап — и тогда это совсем неплохой вариант!