Парсинг списка экспонентов с wtm.com
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')
Вы можете найти весь код здесь.
Вот и все. Надеюсь, вы найдете это полезным. Спасибо за чтение.