CoderCastrov logo
CoderCastrov
Python

Парсинг списка экспонентов с wtm.com

Парсинг списка экспонентов с wtm.com
просмотров
1 мин чтение
#Python
Table Of Content

    В этом посте я поделюсь шагами парсинга списка экспонентов. URL-адрес:

    [https://www.wtm.com/london/en-gb/exhibitor-directory.html](https://www.wtm.com/london/en-gb/exhibitor-directory.html)

    Когда вы открываете веб-сайт, вы можете заметить, что данные загружаются динамически. Это означает, что данные не будут доступны при использовании инструмента "Просмотреть исходный код". Но если мы проанализируем сетевой трафик с помощью инструмента инспектора, там действительно есть API, который используется сайтом для поиска данных.

    Вот API, которое я нашел:

    URL = [https://xd0u5m6y4r-2.algolianet.com/1/indexes/event-edition-eve-a1deadc9-75a4-41f3-8106-a249f573a88b_en-gb/query?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%203.27.1&x-algolia-application-id=XD0U5M6Y4R&x-algolia-api-key=d5cd7d4ec26134ff4a34d736a7f9ad47](https://xd0u5m6y4r-2.algolianet.com/1/indexes/event-edition-eve-a1deadc9-75a4-41f3-8106-a249f573a88b_en-gb/query?x-algolia-agent=Algolia+for+vanilla+JavaScript+3.27.1&x-algolia-application-id=XD0U5M6Y4R&x-algolia-api-key=d5cd7d4ec26134ff4a34d736a7f9ad47)Метод: POSTЗаголовки:
    'Content-Type': 'application/json'Тело:
    {'params': 'query=&page=0&facetFilters=&optionalFilters=%5B%5D'}

    Когда вы смотрите на тело запроса, вы можете видеть, что результат фактически разбит на страницы.

    Мы нашли все, что нам нужно. Давайте перейдем к кодированию.

    Вот инструменты, которые нам понадобятся:

    Сначала нужно установить инструменты:

    pip install requests
    pip install pandas

    Нам не нужно устанавливать json, потому что это встроенный модуль.

    Создайте новый файл Python. Давайте начнем с импорта инструментов:

    import json
    import requests
    import pandas as pd

    Затем объявите URL-адрес:

    url = 'https://xd0u5m6y4r-2.algolianet.com/1/indexes/event-edition-eve-a1deadc9-75a4-41f3-8106-a249f573a88b_en-gb/query?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%203.27.1&x-algolia-application-id=XD0U5M6Y4R&x-algolia-api-key=d5cd7d4ec26134ff4a34d736a7f9ad47'

    Мы определяем функцию get_payload :

    def get_payload(page):
        return {
            'params': f'query=&page={page}&facetFilters=&optionalFilters=%5B%5D'
        }

    Мне нужна эта функция, чтобы создать данные для каждой запрошенной страницы.

    Затем я начал перебирать каждую страницу результатов из API:

    result = []
    page = 0
    i = 0
    
    while True:
        r = requests.post(url, data=json.dumps(get_payload(page)), headers={'Content-Type': 'application/json'})
    
        data = r.json()
        hits_data = data['hits']
    
        if len(hits_data) == 0:
            break
    
        for row in hits_data:
            result.append(
                {
                    'name': row['name'],
                    'companyName': row['companyName'],
                    'website': row['website'],
                    'phone': row['phone'],
                    'email': row['email'],
                    'countryName': row['countryName'],
                    'mainStandHolderName': row['mainStandHolderName'],
                }
            )
    
        i = i + 1
        page = page + 1

    Этот код будет продолжать цикл, пока не будет найден больше результатов. Результат сохраняется в списке result .

    После получения всех данных они будут экспортированы в CSV-файл:

    df = pd.DataFrame(result)
    df.to_csv('result.csv')

    Вы можете найти весь код здесь.

    Вот и все. Надеюсь, вы найдете это полезным. Спасибо за чтение.