Как программисты ищут квартиры

    image

    На самом деле все происходит не так...

    Один мой знакомый попросил меня написать эту статью. В статье пойдет рассказ о его похождениях, которые могут (могли) быть неправильно восприняты администрацией определенных интернет-ресурсов. И те, в свою очередь, могут (могли) пожаловаться на моего знакомого куда следует. Поэтому пишу статью с его слов я. А он уехал. В Гондурас. Насовсем.

    Проблема


    Пару лет назад (наконец-то!) наступил в моей жизни момент, когда мне нужно можно было купить квартиру. Оставалось ее найти. Дело осложнялось тем, что были у меня свои взгляды на то, какой должна быть моя идеальная квартира. А именно — она должна была быть НА последнем этаже. Ну чтобы никто по мозгу не ходил. Ну и плевать на всех удобнее.

    Центровой местный сайт по поиску недвижимости (абсолютное большинство агентств и собственников размещают свои квартиры здесь), как бы это помягче сказать, «сделан был немного неудобно». Поиск квартир на нем содержал стандартные для подобных сервисов настройки: год постройки, этажность, цена, не (!) последний/первый этаж и т.д. Причем он, поиск, когда я его просил выдать мне квартиры с раздельным санузлом, иногда выдавал квартиры с совмещенным. С балконом была похожая история. А раз он (поиск) иногда выдает квартиры несоответствующие моему запросу, то, возможно, он не показывает и соответствующие. А в мою выборку (квартира на последнем этаже, раздельный узел, этажность > 5, недалеко от метро, и бла бла бла) уже по определению не могло попадать много квартир…

    Ковальски, варианты!


    Оставалось только одно — выгрузить все квартиры с сайта к себе локально: сохраняешь их в какую-нибудь базу, берешь в руки SQL (ну или помоднее что-нить) «и погнал» (с).

    Легко сказать, но сложно сделать. Первой идеей было посмотреть на движок сайта, поискать в нем какие-нибудь дыры, достучаться до сервера, где хранится вся информация о квартирах, ну и скопировать ее оттуда. Но это плохо, видимо, квалификации моей на тот момент не хватило.

    На целевом сайте нашелся раздел для агентств по недвижимости. Сотрудничество, все дела. Там, при условии, что ты — агентство, можно было получить (купить?) доступ к специализированному ПО, которое, судя по инструкции к нему и скриншотам, позволяло в автоматизированном виде подавать объявления от лица агентства (от спамеры, да?). Теоретически, в этом ПО тоже можно было найти информацию о серверной стороне и вытащить оттуда информацию о квартирах. Тут-то моей квалификации, думаю, хватило бы. Но доступа к ПО у меня не было, а агентством становиться не хотелось.

    Поэтому ничего не оставалось, кроме как написать его…

    Парсер


    Программно заходим на сайт, «ищем» все квартиры и парсим результаты, сохраняя их в локальную БД. Писать парсер решил на Python — относительно новый язык для меня на тот момент он был, а поднять уровень в нем было полезно (поэтому и код соответствующий).

    Для скачки страниц применялась стандартная urllib:

    from urllib import FancyURLopener, quote_plus
    ...
    
    flatsPageContent = urlOpener.open(flatsPageURL).read()
    

    Для парсинга HTML решил использовать (после активного гугления) библиотеку lxml:

    from lxml.html import parse
    ...
    
    flatsPageDocument = parse(flatsPageFilePath).getroot()
    if flatsPageDocument is not None:
    	flatsTables = flatsPageDocument.xpath('//*[@id="list"]')
    

    Все это банально и неинтересно. А интересным было другое.

    А далеко ли метро?


    Будучи человеком безлошадным и перемещающимся строго на общественном транспорте, для меня было критично близость метро к моей будущей квартире. Эдак, метров не больше 2х тысяч. Поэтому возникла идея определения ближайшей станции метро к квартире, и ее расстояния к ней. А потом и реализация:

    Немного кода
    def getFlatLocation(flatPageName, flatAddress, mode, geoDBCursor):
    	logging.info('Retrieving geo code info for flat \'%s\' (mode \'%s\')...' % (flatPageName, mode))
    	flatFullAddress = (flatBaseAddress + flatAddress).encode('utf8')
    	
    	geoCodeResult = ''
    	isGeoCodeResultCached = 1
    	geoDBCursor.execute("SELECT geoCode FROM %s WHERE address = ?" % ("GeoG" if mode == 'G' else "GeoY"), (flatFullAddress,))
    	geoCodeResultRow = geoDBCursor.fetchone()
    	if geoCodeResultRow is not None:
    		geoCodeResult = geoCodeResultRow[0]
    
    	if geoCodeResult is None or len(geoCodeResult) == 0:
    		isGeoCodeResultCached = 0
    		geoCodeURL = ('http://maps.google.com/maps/api/geocode/json?sensor=false&address=' if mode == "G" else 'http://geocode-maps.yandex.ru/1.x/?format=json&geocode=') + quote_plus(flatFullAddress)
    		urlOpener = UrlOpener()
    		geoCodeResult = urlOpener.open(geoCodeURL).read()
    
    	if geoCodeResult is None:
    		geoCodeResult = ''
    
    	logging.info('Geo code result for flat \'%s\' was fetched (mode \'%s\', from cache - %d)' % (flatPageName, mode, isGeoCodeResultCached))
    
    	flatLocation = 0
    	geoCodeJson = json.loads(geoCodeResult)
    	if geoCodeJson is not None and (len(geoCodeJson['results']) if mode == 'G' else len(geoCodeJson['response'])):
    		if isGeoCodeResultCached == 0:
    			geoDBCursor.execute("INSERT INTO %s VALUES (?, ?)" % ("GeoG" if mode == 'G' else "GeoY"), (flatFullAddress, geoCodeResult))
    		if mode == "G":
    			geoCodeLocation = geoCodeJson['results'][0]['geometry']['location']
    			flatLocation = {'lat': float(geoCodeLocation['lat']), 'lng': float(geoCodeLocation['lng'])}
    		else:
    			geoCodeLocation = geoCodeJson['response']['GeoObjectCollection']['featureMember'][0]['GeoObject']['Point']['pos']
    			(flatLocationLng, flatLocationLat) = re.search('(.*) (.*)', geoCodeLocation).group(1, 2)
    			flatLocation = {'lat': float(flatLocationLat), 'lng': float(flatLocationLng)}
    		
    		logging.info('Geo code info for flat \'%s\' was retrieved (mode \'%s\')' % (flatPageName, mode))
    	else:
    		logging.warning('Geo code info for flat \'%s\' was NOT retrieved (mode \'%s\')' % (flatPageName, mode))
    
    	return (flatLocation, isGeoCodeResultCached)
    


    Как видно из кода, в качестве источника данных геокодирования используются Google и Yandex. Почему не кто-то один? Просто для новых улиц (да и для старых, или некорректно введенных) кто-то из источников мог выдать неправильные или усредненные данные (координаты центра города, например). Поэтому два движка используются одновременно, чтобы можно было визуально отсеять явно неверные результаты. Понятное дело, что и у Google'а и Yandex'а существовала квота на количество запросов в сутки с IP. Поэтому результаты «пробивания» адресов бережно сохранялись в базу для использования при последующих запусках парсера.

    С помочью гугло-карт была набита таблица с координатами станций метро, в том числе еще строящихся. А расстояние определялось просто с помощью теоремы Пифагора:

    def calculateDistance(location1, location2):
    	# haversine formula, see http://www.movable-type.co.uk/scripts/latlong.html for details
    	R = 6371 * 1000 # Radius of the Earth in m
    	dLat = (location2['lat'] - location1['lat']) * (math.pi / 180)
    	dLng = (location2['lng'] - location1['lng']) * (math.pi / 180) 
    	a = math.sin(dLat / 2) * math.sin(dLat / 2) + math.cos(location1['lat'] * (math.pi / 180)) * math.cos(location2['lat'] * (math.pi / 180)) * math.sin(dLng / 2) * math.sin(dLng / 2) 
    	c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    	d = R * c
    	return d
    

    А вот и ближайшая станция метро:

    def getFlatDistanceInfo(flatLocation):
    	flatSubwayStationDistances = map(lambda subwayStationInfo: calculateDistance(flatLocation, subwayStationInfo['location']), subwayStationInfos)
    	flatNearestSubwayStationDistance = min(flatSubwayStationDistances)
    	flatNearestSubwayStationName = subwayStationInfos[flatSubwayStationDistances.index(flatNearestSubwayStationDistance)]['name']
    	flatTownCenterDistance = flatSubwayStationDistances[0]
    	return (flatNearestSubwayStationName, flatNearestSubwayStationDistance, flatTownCenterDistance)
    


    Отслеживание цены квартиры


    Все мы, наверное, не раз читали статьи типа «Цены на квартиры в городе N стали снижаться на X% в месяц». Так вот у меня на эту тему было свое мнение.

    Раз все извлеченные квартиры сохранялись локально в базу, то можно было отслеживать изменения цен на них. Заглядывая в старую базу данных и находя информацию об извлекаемой квартире там, можно было рассчитать дельту ее цены:

    isFlatInfoUpdated = 0
    flatPriceDelta = 0
    if len(oldFlatsDBFilePath):
    	oldFlatsDBCursor.execute('''SELECT flatPriceInfo FROM Flats WHERE flatPageURL = ? AND flatAddress = ? AND flatWholeSquare = ? AND flatLivingSquare  = ? AND flatKitchenSquare = ?''', (flatPageURL, flatAddress, flatWholeSquare, flatLivingSquare, flatKitchenSquare,))
    	oldFlatInfoRow = oldFlatsDBCursor.fetchone()
    	if oldFlatInfoRow is not None and oldFlatInfoRow[0] is not None:
    		isFlatInfoUpdated = 1
    		oldFlatPriceInfo = oldFlatInfoRow[0]
    		try:
    			flatPriceDelta = float(flatPriceInfo) - float(oldFlatPriceInfo)
    		except ValueError:
    			pass
    

    Поэтому, каждый раз читая статьи с анализом рынка недвижимости, я улыбался, зная, что «мои» квартиры вовсе не растут в цене. Может, они никому кроме меня не были нужны?

    Вам раздельный или совмещенный?


    Я программист, а программисты много думают. А разве такое возможно в совмещенном санузле?

    Проблема была в том, что сайт поиска недвижимости скрывал эту информацию внутри страницы описания квартиры и не показывал в списке результатов поиска. Поэтому был добавлен специальный режим работы парсера, названный «flatsDeepParseMode». Как говориться, «We need to go deeper» (с). Он разрешал парсеру скачивать не только страницы результатов поиска квартир, но и непосредственно страницы описания квартир. А уже из них извлекалась дополнительная информация по санузлу и прочему.

    Отказоустойчивость


    В режиме глубокого парсинга скрипт мог сильно нагружать сервер, долбя его просьбами на отдачу тысяч страниц. Это в свою очередь иногда приводило к задумчивости сервера, а, бывало, и к его отказам выполнять запросы. Поэтому скрипт после таких случаев стал поддерживать механизмы «переспроса» страниц с постепенно увеличивающимся таймаутом между попытками.

    Маскировка


    Однажды скрипт перестал работать. Посыпались сообщения, что сервер что-то там не может ответить, таймауты и бла бла бла. Оказалось, что владельцы сайта недвижимости наняли группу специально обученных людей, чтобы те впилили фильтрацию юзер-агентов, подключающихся к серверу клиентов (чего это они вдруг?). И мой скрипт попал под раздачу. А решилось это просто — скрипт прикинулся браузером:

    class UrlOpener(FancyURLopener, object):
        version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
        pass
    

    Но однажды случилось страшное…

    You are banned!


    Да, меня забанили. И не только меня, как оказалось. Придя утром на работу (нужно же было как-то на квартиру зарабатывать), я увидел уже знакомое сообщение об ошибке, что сервер что-то там, таймауты и бла-бла-бла. Замена юзер-агента на очередной браузерный не помогла. Ведь даже браузеры не могли открыть сайт недвижимости… Да, весь наш статический IP забанили на стороне сервера. Уж не знаю, почему это произошло. Возможно, «какая-то вирусная программа слала много запросов на сервер» или сразу несколько десятков сотрудников компании решили поискать себе жилье. Но, как бы то ни было, нас забанили.

    Так уж случилось, но юристам нашей компании нужно было что-то поискать на том сайте (возможно, квартиру для наших заморских коллег). А вот они-то не дали спуску администрации обнаглевшего ресурса. Мы ведь ничего такого не совершали. Никого не ддосили. Правда-правда. В общем, нас разбанили. Под честное слово.

    Фичи, фичи, фичи...


    Парсер еще много чего умеет: парсит квартиры до определенной цены, помечает удаленные квартиры и вновь добавленные, подсчитывает количество фотографий квартиры и т.д.



    Мы берем ее, заверните


    Свою идеальную квартиру я все-таки нашел. Последний этаж, рядом с метро, все дела. Нашел бы я ее без написания парсера? Не знаю, возможно. Но это было бы неспортивно, не по-программистски как-то…

    P.S.


    И да, я помню про старую статью на хабре, где такой же извращенец энтузиаст, как я, парсил и анализировал квартиры на языке R. И он тоже купил свою правильную квартиру. А значит — это работает.

    Кстати мой парсер может уже и не работать либо работать некорректно (в связи с возможными изменениями на сайте) т.к. использовался довольно давно. И поосторожнее с ним, а то могут забанить (бывали случаи).

    А компот код?!


    По просьбе знакомого выкладываю исходники парсера на bitbucket.org. В репе можно найти и файлик с довольно большим, выстраданным SQL запросом, визуализирующим все извлеченные данные. Код, естественно, размещается только для вашего ознакомления.

    Всем спасибо за внимание.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 96

      0
      Помню один знакомый парсил скриптом сайт чемпионата мира по футболу на предмет свободных мест которые ему подходили и присылал уведомления себе на почту о том что билет найден.
        0
        Я сайт РЖД так парсил когда то на предмет появления билетов. Обычная практика для программистов, видимо )
          +4
          похоже на то.
          заявление в ЗАГС подавал через электронную очередь, так чтобы на нужную дата/время попасть, просто URL подобрал и напрямую прошёл. А то без пяти полночь сайт напрочь зависал минут на 15, а до нужной ссылки надо было несколько шагов делать и пока дошёл бы, то уже всё занято было бы.
            0
            Я так же парсил себе работу
              +1
              А я когда-то писал бота на резервирование собеседования на визу :)
            +1
            А я запись на приём в финское консульство мониторил.
              +1
              Там еще можно написать скрипт для «бронирования» мест для желающих ехать одному в купе, благодаря багу (или наоборот фиче) на сайте )
            +35
            И где вы берёте такие идеальные сайты? В моём городе на «самом главном сайте по недвижимости» одна и та же квартира может быть выставлена раз 6, при этом в разных вариантах будут указаны разные цены, разные площади, этажи, и т.д. О реальных параметрах квартиры становится известно только уже по приходу, а на вопрос «какого черта?» риэлторы отвечают «та перепутали\так вышло\больше объявлений — больше шансов продать». Ну, что ты тут пропарсишь?
              +9
              Тут сложно, да. Нужно какую-то эвристику прикручивать, чтобы находить дубликаты квартир… А риэлторы дормоеды, как по мне, и играют нечестно, бывает.
                0
                А они вообще честно играют?
                  0
                  Я лично знаком с ровно одним кристально честным риэлтером. Причем я и покупал через нее квартиру, и продавал, и сдавал. Жильцов она мне, к тому же, нашла идеальных — они сами ремонт косметический сделали, еле уговорил взять деньги за обои :)
                    +2
                    А в каком городе? Контактами не поделитесь?
                      0
                      Город у меня написан в хабрацентре. Если вы серьезно, то подробности — в личку.
              • UFO just landed and posted this here
                  0
                  Да, интересно было бы источник увидеть и город узнать.
                  По питеру по продающимся квартирам более или менее ситуация нормальная, порядка 90% вариантов в принципе реальные.
                  Однако по сдающимся квартирам реальных вариантов около 3%, остальные рекламные и примерные или же устаревшие.
                  Отчасти это объясняется тем, что продающиеся квартиры обычно висят несколько месяцев до продажи, а арендованные уходят за пару дней — поэтому реальные варианты зачастую и выставлять смысла нет.
                  Но тем не менее факт есть факт, базы реальных арендных квартир в питере просто нет.
                  –47
                  Повеселили, только русский программист способен на такое!
                    +16
                    О да, великая русская смекалочка
                      +21
                      Почему «только»? Предполается, что ушлый датчанин или изралитянин такого делать не будет?
                        +7
                        Не, мы ленивые, мы обычно пользуемся дармовым трудом русских программистов :-)
                        P.S. Судя по карточке пользователя, автор статьи из Беларуси.
                          0
                          Какой же это ад, наверное, для программистов когда заказчик не просто тп, но и ленивое жпп(жалкое подобие программиста), которое думает что тоже знает как надо делать(
                            +1
                            евро-жпп)
                        +5
                        Я сейчас вам сломаю всю вселенную: я делал подобное, я программист и я не русский.
                          –3
                          Россия многонациональная страна! Быть русским — не значит иметь в паспорте надпись и бегать с имперским флагом. Понятие русский намного шире, чем Вы, дорогие «ушлый датчанин или изралитянин», которые при этом пишут на русском, можете себе представить!
                            +13
                            Рад за Россию, но я там не живу и жить не планирую. Как вообще связаны между собой язык, генетические особенности, национальность и подданство? На Хабре вообще-то принято писать по-русски. Даже в правилах так написано:

                            Мы любим русский язык и не любим тех, кто его коверкает.


                            Но все ли, кто говорит по-русски — автоматически становятся русскими? А если я тремя языками владею свободно, я сразу трёхнациональным становлюсь? А если кто-то относит себя к одной национальности, живёт в другой стране, а гражданство имеет третьей, то как быть? В общем, русские — это такой восточнославянский этнос. Многочисленный, но не единственный на планете, и ровно такой же уникальный, как и любой другой. И быть русским — это обладать заметной частью признаков этого этноса и идентифицировать себя с ним. А учитывая, что автор статьи из Республики Беларусь, то с большой вероятностью он относится к другому восточнославянскому этносу — к белорусам (не единственному на планете, и ровно такому же уникальному, как любой другой). Думаю, вам бы вряд ли было приятно, если бы вас так безапелляционно записали в удмурты или тутси. Почему вы себе такое позволяете для меня загадка.
                              –17
                              Для саморазвития можете посмотреть выступления Задорнова М.Н. Он, к слову, родился в Латвии.
                              "… генетические особенности, национальность и подданство..." — Вы настолько сноб, что готовы придраться к любой фразе, которая на Ваш взгляд неверно употреблена, а надо, всего лишь, посмотреть под другим углом.

                              Да, и ещё, умение трактовать правила хабра в своих интересах это ужасно! Данная фраза написана не в ущерб иноязычным статьям/постам и т.п., а тем, кто употребляет сенг, сокрашения, смайлики, жаргон и прочую нечисть.
                                +5
                                > Для саморазвития можете посмотреть выступления Задорнова М.Н.

                                Плюсую. Например, вы знали, что английское слово «intransigent» произлошло от русских слов «бог» и «ложка»?
                                  +1
                                  А вы знали, что абсолютно все «открытия» господина Задорнова в словообразовании — антинаучная туфта? Честно-честно. Почитайте, что ли, что думают о его идеях лингвисты…
                                  Или я уже шуток не понимаю… в таком случае, простите. Просто безмерно раздражает он меня — гадит людям в уши…
                                    +2
                                    Это была шутка, конечно. Сложно найти кого-то, кто несёт большую чушь, чем он. Начиная от происхождения слов и заканчивая рассказами о том, как американские студенты не могли понять, как варить картошку.
                                      0
                                      Знаете, над некоторыми вещами лучше не шутить. И не потому, что «святое», а потому, что больное. Я лично знаю людей (и вполне адекватных, причем репродуктивного возраста), которые некоторые заявления этого господина вполне себе принимают на веру.
                                      Вы меня напугали слегка своим тонким троллингом :)
                                  +13
                                  Для саморазвития можете посмотреть выступления Задорнова М.Н.
                                  Ой, всё…
                                    –12
                                    Вот именно. Русский — давно уже перестало является только обозначением этнической группы.
                                      +14
                                      Моим предыдущим комментарием я пытался в сдержанно комической форме выразить удивление от того, что кому-то предлагают (не всерьёз, надеюсь :)) использовать выступления Задорнова М.Н. для саморазвития
                                    +2
                                    Знатный у вас оксюморон получился. Я готов мириться с ярмом сноба, но не готов для саморазвития смотреть выступления Задорнова М. Н., родись он хоть на Луне. Саморазвитие в том направлении, которое задаёт этот конкретный человек, в моей системе моральных координат равнозначно даже не движению назад — движению в направлении, перпендикулярном здравому смыслу.

                                    Вашу точку зрения я понял, надеюсь вы понимаете мою. Судя по большой разнице во взглядах на жизнь, стоит ли продолжать дискуссию, тем более, что от тематики данного ресурса она бесконечно далека?
                                      –2
                                      Простите великодушно, а для вас русский язык является родным?
                                      Спрашиваю исключительно из интереса — восхищен, как вы им владеете :)
                                +4
                                Да какая разнится — русский или нет? просто когда нечем гордиться, то и цвет кожи ьывает сгодится.
                              +7
                              Я помню историю, как один товарищ парсил сайт знакомств. Дело в том, что сайт выдавал только некоторую часть информации по каждому объекту. Поэтому товарищ автоматически регил несколько клонов до тех пор, пока не получал всю информацию. Ну, потом все это в базу данных и сортировка по нужному компаратору. Насколько я помню, он нашел что искал.
                                +4
                                Да, а еще можно ботом просто ходить по «правильным» анкетам. А потом владельцы этих анкет будут заходить к тебе в гости в ответ. И смотреть твой профиль. И тут уже можно поиметь кусочек профита.
                                  +15
                                  И нет, жену себе я не так искал :)
                                    +40
                                    Мы не расскажем вашей жене про то, как вы сейчас пропалили любовницу.
                                      +3
                                      из текста, таки не следует, что два субъекта — «жена» и «не жена», были одновременно.
                                        0
                                        Так и не следует что не занимается поиском жён на добровольных/бизнеса началах. А ещё не следует что он не занимался поиском не для себя не жены… Странное занятие О_-
                                      0
                                      А кому ещё кроме себя искал?)
                                      0
                                      о! так и делаем =)
                                    +7
                                    Мне кажется давно пора всяким сайм по недвижимости помимо формы давать еще «поиск для профессионалов» где писать прям sql (назовем это RQL realty query language)
                                      0
                                      Люто, бешено плюсую
                                        0
                                        уже запилили, давно, кстати, не знаю, взлетел ли.
                                        на тему «найти мужа программиста», кажется
                                          0
                                          только надо определить там свои жёсткие стандарты, а то ведь и там начнётся кто в лес, кто по дрова
                                            0
                                            Сразу API нужно к любым каталогам прикручивать.
                                              +2
                                              Вы бы ещё коммунизм предложили построить и фейсбуку социальный граф весь в открытый доступ без лимитов выложить со стриммингом изменений… Ага
                                              +3
                                              Для парсинга можно прикупить пачку прокси. Но не вежливо беспощадно долбить сервер, лучше сразу разумную паузу выставлять, в зависимости от посещаемости и скорости работы сайта.
                                                0
                                                Уже с десяток форков репы сделали, так что версия скрипта с поддержкой прокси может появиться уже скоро.
                                                  +1
                                                  не вежливо долбить сервер и не смотреть рекламу.
                                                  –3
                                                  А в Питере все для людей: www.bn.ru/zap_fl_w2.phtml )))
                                                    0
                                                    Наш офис на этом сайте тоже беспощадно забанен на их стороне, видимо кто-то из наших этим поиском тоже не был удовлетворён.
                                                    +16
                                                    Когда мне надо было кошку купить, я сделал сайт про куплю-продажу животных. И ничего парсить не пришлось.
                                                      0
                                                      Интересно, а сколько часов ушло на написание парсера?
                                                        –2
                                                        Ваш знакомый парсил с рабочего компа/IP? За такое, мягко говоря, надо премии лишать.
                                                          +1
                                                          Ну, таким парсингом еще можно машинку стресс-тестить, например. Ну, или не машинку а сервер — кто там знает, чем программист занимается в чёрной консоли.
                                                            +2
                                                            А я и ничего и не имел против работы. Если это по работе надо, то вперёд, с санкции руководства. А судя из этой истории человек допустил занесение рабочего IP в чёрный список, никому не сказал. При этом коллегам сервис тоже был нужен, получается он и коллег подставил.
                                                              0
                                                              А ещё можно за ночь на 300тр слить трафика для компании, тестово выкрутив параметр перед уходом домой. Странно вообще по офисному каналу что либо лить для парсинга, дешевле и спокойнее ту же vds брать для кача и извлечения полезной нагрузки с последующим сжатием и передачей куда надо. например, с террабайта траффика получаем 30гб структурированных данных -> сжимаем в 3-5 гб и льём -> профит в 1000/5 == 200 раз)
                                                                +4
                                                                > 2015 год
                                                                > на 300 тр слить трафика
                                                                  0
                                                                  Это до сих пор не очень сложно. Всё зависит от координат.
                                                                    0
                                                                    1. 300 тысяч рублей
                                                                    2. Это было пару лет, раз уж было, хотя это ничего не меняет, т.к. п. 1 =)
                                                                      0
                                                                      1. Юрики — сразу ценник отдельный.
                                                                      2. Есть такие места, типа Таймыра, Камчатки, где трафик до сих пор помегабайтно (сам за ночь сливал на 2500, всего 8 лет назад, а я ведь в Европейской части).
                                                            +2
                                                            Ну уж искать расстояние между двумя точками в пределах одного города, исходя из сферичности земли — то ещё приближение. Искривление рельефа большую погрешность внесёт, да и вообще в пределах города (и в столь локальных, как 2км до метро) правильней использовать даже не евклидову, а манхэттенскую метрику.
                                                              +1
                                                              Манхэттенскую метрику использовать не получится — разные районы города могут быть по-разному «повернуты». Но евклидова как приближение сойдет.
                                                                0
                                                                Да, про поворот не подумал, значение в полтора раза может отличаться от действительного.
                                                              +3
                                                              К слову, последний этаж тоже имеет свои недостатки. У многих домов бывают проблемы с крышей, и если она течет — страдать будут в первую очередь владельцы квартир на последнем этаже.
                                                                +1
                                                                Да, согласен. Поэтому из всех последне-этажных квартир, знакомый выбрал самую нетекущую.
                                                                +2
                                                                Когда-то давно тоже понадобилось писать скрейпер с нескольких тематических сайтов. Но понимание что забанят было сразу. Поэтому мы нашли места где публикуют адреса анонимных прокси-серверов. С утреца приходишь, берёшь свежую пачку прокси и суёшь в проверялку — она по быстрому проверяет что прокси адекватные, т.е. не искажают респонз своим кодом. После этого адекватных суёшь в качалку — и начинается ддос. Но там тоже было без фанатизма, запросы размазаны по времени. Со временем прокси прокисают — банятся или просто перестают работать — заменяешь свежими.
                                                                  0
                                                                  А с выбором города не приходилось возиться? Тот же поиск квартир на разных сайтах потребует выбор необходимого города постоянно, что может сильно усложнить ситуацию. Автор, я так понимаю, не возился с этим, так как просто использовал локальный IP для своего города.
                                                                    0
                                                                    Нет, дело не в IP. В скрипте используется захардкоженный URL, который ищет квартиры в нужном городе.
                                                                      0
                                                                      Увы, не везде это прокатит. Выбор города может совершенно разными способами происходить. Кукой, например, или даже в сессии храниться. Приходиться глубоко копать на некоторых сайтах.
                                                                        0
                                                                        Именно поэтому был выбрал сайт, агрегирующий все квартиры от агентств и собственников.
                                                                    0
                                                                    Странно, что не прицепили скраперы для списков проксей… не? Тем более в комплексе Вашей задачи)
                                                                    +7
                                                                    В режиме глубокого парсинга скрипт мог сильно нагружать сервер, долбя его просьбами на отдачу тысяч страниц.

                                                                    за такой парсинг надо отрывать все выступающие части тела.

                                                                    Уж не знаю, почему это произошло. Возможно, «какая-то вирусная программа слала много запросов на сервер» или сразу несколько десятков сотрудников компании решили поискать себе жилье. Но, как бы то ни было, нас забанили.

                                                                    ну конечно. виноваты сотрудники и вирусы. ха-ха!
                                                                      0
                                                                      Не они что ли? Ну ок, ещё пару выходных узлов тора держат админы на серверах с 1с, норм)
                                                                      –1
                                                                      Я на best-proxies списки прокси покупал. Наверное их можно и бесплатно найти, но за те копейки и удобную выдачу, почему нет.
                                                                      Насчет Москвы не знаю, в городах типа 500К квартиры лучше вручную искать, на рынке не так много предложений, а на поиск жилья, в котором будешь жить не менее года, лучше потратить время.
                                                                        +13
                                                                        А теперь осталось только написать парсер (агаа), который парой (сотен) несложных телефонных звонков выкинет квартиры с обременением, вбросы агентов по оценке стоимости, собственников которые внезапно решают передумать продавать, квартиры, где ванна на кухне, кухня в коридоре, коридор в пристройке, нежилой фонд, продаваемый под видом жилого, мансарды и цоколи, выдаваемые за последний и первые этажи, дома в аварийном состоянии, незакрытые встречки, под видом прямых продаж, долевую собственность в виде отдельных квартир, ведомственную собственность, и, ой, а останется ли вообще чего?
                                                                          +3
                                                                          Жестко там у вас в Питере, судя по всему…
                                                                            +4
                                                                            С арендой ещё хуже. Почти везде — агенты, полно фейков. Это было бы не так плохо, если бы агенты не брали себе 100% стоимости месяца аренды в качестве комиссии.
                                                                            +1
                                                                            А чего Вы так скептически? Берёте симбанк, надиктовываете вопросы, цепляете гугловую голосознавалку и проверяете)
                                                                            0
                                                                            Наверняка у каждого была подобная история)) Мы как-то писали парсер для кимсуфи — нужно было арендовать сервер, а их ну уж очень быстро расхватывали.
                                                                              0
                                                                              Я так машину себе покупал.
                                                                              Написал парсер, который отслеживал цены по интересным мне моделям и маркам с учётом курса доллара.
                                                                              На пике цены USD/RUR взял себе отличную Subaru Tribeca, верно прослужившую мне годы.
                                                                                0
                                                                                Интересно, квартира получается была куплена без риэлтора? Мне просто кажется нет, а значит рояльти уже было заложено в стоимость и можно было просто пойти сразу в агенство недвижимости. У меня мама риэлтор если что :)
                                                                                  +1
                                                                                  Да, квартира была куплена через агентство. И да, агенты получили свои деньги. Но поход в агентство мог не сработать в случае моего знакомого. Ведь он сознательно ограничил бы себе выбор, пойдя в какое-то конкретное агентство. Почему? Потому что агентство X продает квартиры Nx, а агентство Y — квартиры Ny. В общем случае множества Nx и Ny не должны пересекаться. Уж лучше выбирать из всего множества квартир, ведь целевой сайт для парсинга — агрегатор всех квартир из агентств и собственников.
                                                                                    0
                                                                                    Я Вас сейчас удивлю, но часто бывает когда 2-3 риэлтора участвуют в цепочке продажи квартиры. Потому что у А, не было квартиры, но зато она была у Б, который знал что есть у В риэлтора. Там очень хитрые связи, говорю же я не с проста знаю ;)
                                                                                  +4
                                                                                  Проблема современного мира в том, что расплодилось слишком много сервисов, в то время как исчезли базы данных в удобоваримом виде. Когда вы последний раз сливали базу телефонных номеров, например, Москвы? А базу IP-геолокаций? Выходных нод TOR-а? Да и просто банальный справочник организаций в каком нить CSV формате.

                                                                                  Зато вебдванольных сайтов-сервисов с jquery и кнопочками like…

                                                                                  Ну и в копилку еще базы данных каталогов товаров в интернет-магазинах. Каждый таким же способом высасывает данные у соседа
                                                                                    0
                                                                                    Стращаете, сударь… Список выходных узлов тора — 1 запрос, база геолокаций — тоже самое, базу телефонных номеров — наверное, сложнее будет-прилется в цикл кач воткнуть. И получится что-то типа: curl $enodes_url >tor.exits; curl $geoip_url > geo; for i in {1..$PNUM}; do update_exit_node tor.exits geo; curl --proxy socks5://localhost:9050 $phones_url"$i"|grep -Eo "$phone_re\|$other_info_re"; done
                                                                                    0
                                                                                    По-моему, у каждого из нас есть подобная история =)

                                                                                    Я лично парсил объявления из платного раздела, не приобретая никаких подписок (мне повезло, лазейку найти все-таки смог). После слива всей базы, отписался в поддержку, где эту лазейку смогли закрыть только через недели 2-3.
                                                                                    Даже «спасибо» не сказали. Сижу и думаю: может и не стоило играть в доброго героя?
                                                                                      0
                                                                                      Как раз ищу квартиру. :)
                                                                                        +2
                                                                                        Для web-crawling'a существует довольно приятный инструмент Scrapy, а с ним теперь и splash для рендеринга js.
                                                                                          +1
                                                                                          Есть еще такой инструмент: Kimono
                                                                                          +1
                                                                                          А все было бы проще и всем было бы проще, если бы:
                                                                                          1) на сайте был продвинутый функционал;
                                                                                          2) на сайте было бы API для доступа к сырым данным;
                                                                                          ну вообщем вы меня поняли, как вы к людям — так и они к вам…
                                                                                            –1
                                                                                            не смог пройти мимо. вставлю и свои пять копеек. у меня был простой парсер на Python, который выдавал мне список статей в топе хабра с урлом (на старом дизайне ещё).
                                                                                              0
                                                                                              Лакмусовый пост парсерами померяться)))

                                                                                              Only users with full accounts can post comments. Log in, please.