Зачем
У каждого молодого DS в какой то момент времени возникает
проблема - очень хочется тяночку, всмысле спарсить тиндер и
сделать тематическое моделирование на описаниях профиля.
Как
Ответ короткий - легко, вот ссылка на collab
Длинный ответ - тиндер обменивается открытым json с https://api.gotinder.com, а в XHR лежит наш x auth key. Остальное - дело техники и библиотеки Response.
Парсинг
Код для профиля
import datetimefrom geopy.geocoders import NominatimAuthKey = ''# Ключ пихуем сюдаTINDER_URL = "https://api.gotinder.com"geolocator = Nominatim(user_agent="auto-tinder")PROF_FILE = "./images/unclassified/profiles.txt"class Person(object): def __init__(self, data, api): self._api = api self.id = data["_id"] self.name = data.get("name", "Unknown") self.bio = data.get("bio", "") self.birth_date = datetime.datetime.strptime(data["birth_date"], '%Y-%m-%dT%H:%M:%S.%fZ') if data.get( "birth_date", False) else None self.gender = ["Male", "Female", "Unknown"][data.get("gender", 2)] self.images = list(map(lambda photo: photo["url"], data.get("photos", []))) self.jobs = list( map(lambda job: {"title": job.get("title", {}).get("name"), "company": job.get("company", {}).get("name")}, data.get("jobs", []))) self.schools = list(map(lambda school: school["name"], data.get("schools", []))) if data.get("pos", False): self.location = geolocator.reverse(f'{data["pos"]["lat"]}, {data["pos"]["lon"]}') def __repr__(self): return f"{self.id} - {self.name} ({self.birth_date.strftime('%d.%m.%Y')})" def like(self): return self._api.like(self.id) def dislike(self): return self._api.dislike(self.id)
Ничего интересного тут нет, просто ходим по html и тянем то что нужно
Работа с API
import requestsTINDER_URL = "https://api.gotinder.com"class tinderAPI(): def __init__(self, token): self._token = token def profile(self): data = requests.get(TINDER_URL + "/v2/profile?include=account%2Cuser", headers={"X-Auth-Token": self._token}).json() return Profile(data["data"], self) def matches(self, limit=10): data = requests.get(TINDER_URL + f"/v2/matches?count={limit}", headers={"X-Auth-Token": self._token}).json() return list(map(lambda match: Person(match["person"], self), data["data"]["matches"])) def like(self, user_id): data = requests.get(TINDER_URL + f"/like/{user_id}", headers={"X-Auth-Token": self._token}).json() return { "is_match": data["match"], "liked_remaining": data["likes_remaining"] } def dislike(self, user_id): requests.get(TINDER_URL + f"/pass/{user_id}", headers={"X-Auth-Token": self._token}).json() return True def nearby_persons(self): data = requests.get(TINDER_URL + "/v2/recs/core", headers={"X-Auth-Token": self._token}).json() return list(map(lambda user: Person(user["user"], self), data["data"]["results"]))
Тут мы получаем json, разбираем его и тащим все что нам нужно(список юзеров)
Кладем все в .csv
import timeimport pandas as pddf = pd.DataFrame()prf = []prsn= []vuz = []gender = []job = []if __name__ == "__main__": token = AuthKey api = tinderAPI(token) while True: persons = api.nearby_persons() for person in persons: #тут нет логики, напишите сами если захотит print(person) time.sleep(1) person.dislike() prf+=[person.bio] prsn+=[person] vuz+=[person.schools] job+=[person.jobs] gender+=[person.gender] print(person.bio)df['vuz'] = vuzdf['jobs'] = jobdf['person'] = prsndf['bio'] = prf df['gender'] = genderdf.to_csv('tinder.csv')
Когда кончаются пользователи оно вылетает и не сохраняет, по этому нужно выделять код для сохранения в отдельную ячейку кода. Благо collab позволяет не думать, а делать. Более опытные пользователи могут сказать что надо обложить в try: , но мне не хочется, да и смысла нет.
Два часа спустя получаем все что хотели!!
Спасибо за прочтение, скоро будет вторая часть про тематическое моделирование с помощью BERT
Большое спасибо я хочу сказать своим подписчикам в телеграмме
Так же в моем телеграмме есть много ноутбуков и статей про DS и не очень. Например рендер 3д моделей на https://colab.research.google.com/ А в рубрике #чтивонаночь я рассказываю про самое интересное, что я нашел за последние время.