Парсим список ваканский средствами Python

от автора

На Хабре уже была заметка, как вытащить и распарсить список вакансий с hh.ru.

Однако там использовался C# — язык сложных предложений с хитрыми интерфейсами. Что же касается обработки больших «простыней» однотипных данных, то для мелких задач в этой области испокон веку применяют скриптовые языки.

Вот и написался небольшой скрипт на python, который утаскивает с hh.ru список вакансий по некоторому запросу (пишется в переменную searchParam) и выводит их в формате CSV. Можно выводить на экран и удивляться, можно перенаправить в output.csv и открыть в каком-нибудь табличном редакторе.

Всё написано около полугода назад на Python 3.x и тестировалось из-под Windows. До сих пор с удовольствием использую как болванку для скрипта, который должен откуда-то что-то скачать.

Странный способ выхода из цикла связан с может быть багой, а может быть фичей hh.ru: если ты попытаешься открыть несуществующую страницу списка результатов, разбитого paging-ом, то вместо 404 он покажет стандартную страницу, но уже без вакансий.

import urllib.parse import re def LoadPageText(url):   import urllib.request   from urllib.error import HTTPError,URLError   opener = urllib.request.build_opener()   try: pageSource = opener.open(url)   except HTTPError as e: return None   except URLError as e: return None   return pageSource.read().decode('utf-8') searchUrl = "http://hh.ru/applicant/searchvacancyresult.xml?text={0}&page={1}&professionalAreaId=0&desireableCompensation=&compensationCurrencyCode=RUR" searchParam = "C++" regExpElemSource = r'<div class="searchresult__name"><span class="b-marker"><a.*?href="(?P<vacancy_url>http://(hh|career)\.ru/vacancy/(?P<vacancy_id>\d+)(\?query=.*?)?|http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?)".*?>(?P<title>[ \(\)а-я\w/,.#+-]*)</a></span>(<.*?>)*?</div>(<div class="b-vacancy-list-nosalary">[\s/а-я.]*</div>|<div class="b-vacancy-list-salary">\s*(от\s*(?P<from>[\d]*(\s*[\d]+){0,2}))?\s*(до\s*(?P<to>[\d]*(\s*[\d]+){0,2})\s*)?(?P<currency>[\wа-я.]+)\s*</div>)<div class="searchresult__placetime"><a href="(?P<company_url>/employer/(?P<company_id>\d*))">(?P<company>[ \(\)а-я\w/,.#+-]+)</a>\s*<span class="searchresult__address">\s*\((?P<city>[ а-я-]*)(,<br/><span style="color:#[a-f\d]*">\s*м.\s*(?P<underground_station>[ а-я-]*)</span>)?\),\s*</span>\s*<span class="b-vacancy-list-date">\s*(?P<date_day>\d+)\s+(?P<date_month>[а-я]+)' regExpElem = re.compile(regExpElemSource, re.IGNORECASE) isFirst = True i = 0 while True :   i += 1   searchUrlPrep = searchUrl.format(urllib.parse.quote_plus(searchParam), i)   pageText = LoadPageText(searchUrlPrep)   if pageText != None:     hasElements = False     for elemVacancy in re.finditer(regExpElem, pageText):       hasElements = True       if isFirst:         [print('"%s"' % x, end=";") for x in elemVacancy.groupdict().keys()]         isFirst = False       print()       [print((elemVacancy.group(key) if key == "from" and key == "to" else str(elemVacancy.group(key)).replace('\u00A0', ' ')) if elemVacancy.group(key) != None else "0", end=";") for iterate, key in enumerate(elemVacancy.groupdict())]     if not hasElements: break 

Любопытствующим будет интересно посетить официальную страницу скрипта, а неугомонным — сделать форк на GitHub и переделать его во что-нибудь совершенно невообразимое.

ссылка на оригинал статьи http://habrahabr.ru/post/166541/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *