Ответы пользователя по тегу Парсинг
  • Как разделить данные с ячеек из таблицы с помощью Xpath?

    @throughtheether
    human after all
    //table[@class="info"]//tr//td/text()
    С какой целью вы используете "//" между tr и td, если td - непосредственный потомок tr? На мой взгляд, лучше указывать максимально специфичное xpath-выражение. Также просьба уточнить, в какой среде (язык программирования) вы используете эти выражения.

    Если вы перепишете ваше выражение так:
    //table[@class="info"]/tbody/tr/td[1]/text(), вы получите значения
    Year, Storey, Area, Condition, Bathroom.

    Аналогично
    //table[@class="info"]/tbody/tr/td[2]/text() даст
    2011, 3, 170, Renovated, 2.
    Далее можете совместить оба списка при помощи используемого вами языка программирования.

    Или можете получить список нод - строк таблицы:
    //table[@class="info"]/tbody/tr и далее, итерируя по ним, получать значения выражений td[1]/text() и td[2]/text().
    Ответ написан
    2 комментария
  • Научиться парсингу - с чего начать?

    @throughtheether
    human after all
    С php не имел удовольствия работать, но поводу парсинга могу пояснить.
    Что вам, по большому счету, надо, так это:

    1) скачать страничку сайта или сделать вызов HTTP API. В этом вам помогут библиотеки вроде curl.

    2) разобрать полученные в п.1) данные. В случае API, как правило,это JSON. В случае HTML вам пригодится знание XPATH-выражений (которые также помогут, если в результате выполнения п. 1) вы имеете XML) и css-селекторов. Исполнять эти запросы будет XML- или DOM-парсер.

    3) полученные в п.2) данные сохранить в конечном или промежуточном виде: CSV, записи в RDBMS (sqlite, mysql, postgresql) или NoSql (Mongo, например)

    В дальнейшей работе помогут Selenium (или другой HTTP клиент с исполнением javascript), очереди заданий, кэширование (redis).

    Думаю, направление для поиска я вам задал.
    Ответ написан
    2 комментария
  • Можно ли "нормально" заработать на разработке парсеров?

    @throughtheether
    human after all
    Насколько мне известно, для сервисов типа auto.ru, drom.ru и прочая продают десктопные парсеры и их даже кто-то покупает (но там аудитория довольно специфическая).
    Ответ написан
    Комментировать
  • Какой python библиотекой парсить Html?

    @throughtheether
    human after all
    Я в подобной ситуации (было около 10 сайтов-источников с разной структурой данных) использовал requests, lxml и XPATH-выражения.
    Как быть не забаненым при такой деятельности?
    Если использовать синхронные библиотеки (requests), то, на мой взгляд, можно особо не переживать по поводу возможной блокировки, если серверы, хостящий сайты, нормально настроены, и вы не слишком часто обращаетесь к сайтам. На всякий случай можете User-Agent неприметный прописать.
    Ответ написан
    Комментировать
  • Как извлечь информацию сайта в удобную таблицу?

    @throughtheether
    human after all
    Встречал ссылки на такое решение, но сам его не использовал (под мои задачи проще самому написать).
    Ответ написан
    2 комментария
  • Как автоматизировать сохранение меняющихся данных из страницы в документ с периодичностью?

    @throughtheether
    human after all
    На каком языке это удобно запрограммировать?

    На мой взгляд, python подойдет (с использованием модулей requests и lxml).
    Ответ написан
    Комментировать
  • Как спарсить значение src из html кода?

    @throughtheether
    human after all
    При помощи selenium:
    from selenium import webdriver
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00%2Frev'
    xpath='//a[@id="pv_open_original"]'
    browser = webdriver.Firefox()
    browser.get(url)
    print browser.find_element_by_xpath(xpath).get_attribute('href')
    browser.quit()

    При помощи requests и lxml:
    import requests
    import json
    import lxml.html
    
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00'
    r=requests.get(url)
    doc=lxml.html.fromstring(r.text)
    search_string=url[url.find('photo'):url.find('%2F')]
    xpath='//a[contains(@href, "%s")]' % search_string
    src=doc.xpath(xpath)[0].get('onclick')
    d = json.loads(src[src.find('{'):src.find('}}')+len('}}')])
    src=d['temp']['base']+d['temp']['z_'][0]+'.jpg'
    print src
    Ответ написан
    Комментировать
  • Что неправильно в коде?

    @throughtheether
    human after all
    Что этот код, по-вашему, должен делать? А что он по факту делает (т.е. что не нравится)?
    UPD:
    Ошибки кода:
    g.go('...') имя переменной g не объявлено, добавьте перед этой строкой g=grab.Grab()
    u = urllib.urlopen(src) имя переменной src не объявлено.
    Другие ошибки: xpath, скорее всего, неверный. То, что вы скопировали его из firebug/firepath, не гарантирует, что grab сможет его обработать. Скорее всего, браузер и grab видят немного разную страницу, это связано с обработкой javascript. Кроме того, мне (grab 0.4.13, pyton 2.7, windows 7) grab ругался, что метод xpath() более не поддерживается (deprecated).
    UPD2:
    рабочий код с использованием grab:
    import urllib
    import grab
    import json
    
    g=grab.Grab()
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00'
    search_string=url[url.find('photo'):url.find('%2F')]
    xpath='//a[contains(@href, "%s")]' % search_string
    g.go(url)
    src=g.doc.select(xpath).attr('onclick')
    d = json.loads(src[src.find('{'):src.find('}}')+len('}}')])
    src=d['temp']['base']+d['temp']['z_'][0]+'.jpg'
    urllib.urlretrieve(src,'bibit.jpg')
    Ответ написан
  • Как парсить html страницы и его обрабатывать?

    @throughtheether
    human after all
    Держите отвратительный, кривой, но работающий код на python:
    from selenium import webdriver
    import time
    browser = webdriver.Firefox()
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    browser.get(url)
    time.sleep(5) # this is bad
    img=browser.find_element_by_xpath('//a[@id="pv_photo"]/img')
    print img.get_attribute('src')
    browser.quit()

    вывод:
    http://cs624016.vk.me/v624016533/a226/owG51bJm59o.jpg

    Как этот код можно изменить:
    1) строку time.sleep(5) заменить на проверку нахождения элемента (ждем секунду, проверяем наличие элемента, если его нет, увеличиваем счетчик и продолжаем; при достижении счетчиком максимального значения - таймаут)
    2) заменить selenium на phantom.js (чтобы окно фаерфокса не появлялось)
    3) понять, что происходит при загрузке страницы браузером и имитировать это поведение при помощи requests.
    Третий путь, на мой взгляд, самый трудозатратный и самый многообещающий (в смысле скорости решения).

    UPD:
    решение при помощи requests:
    import requests
    from lxml.html import fromstring
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    search_string=url[url.find('photo-')+len('photo-'):url.find('%2F')]
    r=requests.get(url)
    doc=fromstring(r.text)
    xpath='//a[contains(@onclick, "%s")]/img' % search_string
    print doc.xpath(xpath)[0].attrib['src']
    Ответ написан
    2 комментария
  • Возможно написать бота, участвующего в акциях?

    @throughtheether
    human after all
    Раз в сутки проводится акция - найди на любой странице среди товаров рекламный баннер, кликни на него и получи скидку (кликающий должен быть авторизован на сайте).

    Если при авторизации происходит установка cookie (без всяких javascript-изысков), то, на мой взгляд, вполне реально написать такого бота, например, на python (используя библиотеки requests и lxml для разбора страницы). Если javascript-изыски все же присутствуют, то, возможно, придется использовать selenium/phantom.js.
    Ответ написан
    Комментировать
  • Как запарсить скрытую информацию?

    @throughtheether
    human after all
    Номер телефона отдается в XML, GET-запрос на URL примерно такого вида:
    http://moscow.drom.ru/auto/?bull_id=16218116&obj=show_contacts&crossdomain_ajax_request=2&request=ajax_show_contacts

    Вам надо подставить соответствующее значение bull_id, оно совпадает с цифрами после последнего слеша и до ".html", то есть 16218116, 16239961 в ваших примерах.
    Ответ написан
    Комментировать
  • Почему Python в разы проигрывает Perl по скорости и расходу памяти при парсинге логов?

    @throughtheether
    human after all
    Я небольшой специалист в python, но предполагаю, что основные ресурсы тратятся здесь:

    host[ip]['data'] = ''
    ...
    host[ip]['data'] = host[ip]['data'] + d

    Почему вы используете словарь как значение ключей внешнего словаря (переменная host)? Попробуйте сделать так:
    host[ip] = ''
    ...
    host[ip] = host[ip] + d
    Ответ написан
    3 комментария