LINUX.ORG.RU

Сетевой бот.


0

1

Для начала, чтобы анализировал код html страницы, выдергивал из них ссылки и переходил по ним. Писать на баше, мне кажется сомнительным. На Питоне? Подскажите в какую сторону копать.

Обычные люди пишут такое на перле в пару регекспов... Зачем тут питон или что-либо еще - непонятно.

Jetty ★★★★★
()

>На Питоне? Подскажите в какую сторону копать.

html5lib (лучше всего) или beautifulsoup

anonymous
()
Ответ на: комментарий от anonymous

> html5lib (лучше всего) или beautifulsoup
Главное научить его выдергивать ссылки из html и php. Дальше уже посмотрим что с ними делать.

PymOxim
() автор топика
Ответ на: комментарий от PymOxim

>wget --spider ничего, кроме проверки ссылок на работоспособность не может.
Он делает точно то, что описано в ОП-посте.

x3al ★★★★★
()
Ответ на: комментарий от PymOxim

Главное научить его выдергивать ссылки из html и php. Дальше уже посмотрим что с ними делать.

За то время, которое ты истратил на написание сообщений в этой теме, можно было бы уже давно всё написать:

import urllib2
from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder('lxml'),
                    namespaceHTMLElements=False)

r = urllib2.urlopen('http://linux.org.ru')
data = r.read()
r.close()
root = parser.parse(data).getroot()
for link in root.iter('a'):
    href = link.attrib.get('href')
    if href and href != '#':
	print 'Link %s' % link.attrib.get('href')
        # Тут делаем что-то со ссылкой

P.S. тут оно требует установленного lxml для питона, но легко переделывается под, например, cElementTree.

anonymous
()
Ответ на: комментарий от anonymous

UPD: форматирование в месте, где принт, немного уехало. Привет копированию из консольных редакторов.

anonymous
()
Ответ на: комментарий от anonymous

Программа дала выхлоп ссылок :) Хотя не все из них являются таковыми.

За то время, которое ты истратил на написание сообщений в этой теме, можно было бы уже давно всё написать:

Я только учу питон. Свободно программировать пока не могу.

PymOxim
() автор топика
Ответ на: комментарий от anonymous

Привет не консольным редакторам, а бесконечному идиотизму разработчиков языка, которые придумали блоки выделять отступами-пробелами. Это же сколько килограммов веществ надо было употребить, чтобы до такого додуматься.

anonymous
()
Ответ на: комментарий от chinarulezzz

>чтоб проще :)

Разбирать регулярками html (и всё прочее xml-подобное) - это пошло :) И небыстро на больших текстах.

Хотя как быстрый вариант на скорую руку сойдёт. Но если подходить серьёзно, то лучше парсером.

anonymous
()
Ответ на: комментарий от PymOxim

>Программа дала выхлоп ссылок :) Хотя не все из них являются таковыми.

По мне так все. Только внутренние ссылки по сайту надо объединять с именем сайта, например через urlparse.urljoin. Это уже мелочи, по сути.

Я только учу питон. Свободно программировать пока не могу.

В приведённом куске кода программирования особо нет. Лучше почитай книжку какую-нибудь, причем не dive into python, а для совсем начинающих, подробную.

Например: http://www.amazon.com/Beginning-Python-Professional-Magnus-Hetland/dp/159059519X

anonymous
()
Ответ на: комментарий от anonymous

>Привет не консольным редакторам, а бесконечному идиотизму разработчиков языка, которые придумали блоки выделять отступами-пробелами. Это же сколько килограммов веществ надо было употребить, чтобы до такого додуматься.

Да всё ок. В редакторе тоже всё ок, при копировании влез \t, скорее всего красноглазый urxvt виноват.

<flame-mode> Отступы не мешают </flame-mode>

anonymous
()

используй python + beautifulsoup.

сначала установи его

sudo easy_install beautifulsoup

вот пример

from BeautifulSoup import BeautifulSoup as Soup
import urllib2

page = urllib2.urlopen('http://linux.org.ru/').read()

soup = Soup(page)
links = soup.findAll('a')

for link in links:
    print link.get("href"),

тут документация: http://www.crummy.com/software/BeautifulSoup/documentation.html

Donnie_Darko
()
Ответ на: комментарий от chinarulezzz

> Что-то по стилю uju напоминает...
Не понял.

PymOxim
() автор топика
Ответ на: комментарий от chinarulezzz

помню, когда я мучался регурярками, чтобы парсить html - код. потом наткнулся на эпическую страничку на stackoverflow - it is true that asking regexes to parse arbitrary HTML is like asking Paris Hilton to write an operating system и прочее типа Chuck Norris can parse HTML with regex

начните пользоваться BeautifulSoup и мир покажется ярче!

Donnie_Darko
()
Ответ на: комментарий от Donnie_Darko

>используй python + beautifulsoup.

Они сначала писали, что суп умер: http://www.crummy.com/software/BeautifulSoup/3.1-problems.html

Но потом вроде родилась 4-я ветка. В любом случае, html5lib (рекомендуемый супом, кстати), умеет beautifulsoup в качестве бэкенда.

anonymous
()
Ответ на: комментарий от Donnie_Darko

Короче, нужно импортировать либу для анализа синтаксиса хОтмл.

PymOxim
() автор топика
Ответ на: комментарий от chinarulezzz

>import re

Хм, беглый взгляд на код парсера не помог мне найти применение sanitizer внутри него. Хотя может я и ошибаюсь.

Но люди со stackoverflow со мной массово согласны:)

В случае валидного xml, кстати, SAX-парсер должен быть в любом случае быстрее регулярок.

Кстати о скорости... Готов померяться посоревноваться. Я утверждаю что простая регулярка быстрее окажется чем «парсер» :)

Надо попробовать написать тест, когда время будет.

anonymous
()
Ответ на: комментарий от Donnie_Darko

>Вы часто используете python3?

Сознаюсь, со мной такое случается.

Но раз html5lib поддерживает beautifulsoup, то почему бы сразу не использовать его?:)

anonymous
()
Ответ на: комментарий от Donnie_Darko

>помню, когда я мучался регурярками, чтобы парсить html - код.

бывает иногда что просто «не осилил», и не разобравшись, взяв другой инструмент и сделав работу - начинаешь винить прежний. Быть может у тебя так всё и было?

начните пользоваться BeautifulSoup и мир покажется ярче!


я пользуюсь в зависимости от задачи :)

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

Я утверждаю что простая регулярка быстрее окажется чем «парсер» :)

я утверждаю что в данной задаче пофиг чем пользоваться в 99.99% случаев :)

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

html5lib/inputstream.py:import re

html5lib/ihatexml.py:import re

и т.д. :)

Но люди со stackoverflow со мной массово согласны:)

не аргумент. Регулярки сложны, их надо понимать и разбираться. Легче использовать готовый велосипед, где всё более понятно.

Надо попробовать написать тест, когда время будет.

надо, надо. Попробуйте когда будет время :)

chinarulezzz ★★
()
Ответ на: комментарий от true_admin

не-не-не, с так поставленным утверждением не спорю :D

P.S. Просто, беру из опыта. Для программ у которых специфичная задача - код затачивается сугубо под эту задачу для скорости, лаконичности, меньшей зависимости и т.д. Идеалист наверное :) Хотя тут, да, без разницы что использовать...

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

меньшей зависимости

bicycle

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

lolwhut?

бывает иногда что просто «не осилил», и не разобравшись, взяв другой инструмент и сделав работу - начинаешь винить прежний

Бывает. Но я не столько не «не осилил», сколько не хочу видеть в своем коде, который буду через n месяцев редактировать вот такое:

import re
result = re.search('<title>(.*)</title>', page, re.IGNORECASE or re.DOTALL).group(1).strip()

в то время как мог написать так:

soup = BeautifulSoup(page)
title = soup.html.head.title.text
Donnie_Darko
()
Ответ на: комментарий от chinarulezzz

>Идеалист наверное :)

Вот именно из-за проклятого перфекционизма и идеализма я и предлагаю брать сразу парсер, чтобы при расширении функциональности программы не заниматься костылями с регулярками.

Может там надо будет условиями проверять найденные крупные блоки html-кода, тогда легче будет делать всё в одном цикле с if-ами, чем парсить сначала одной регуляркой, затем её результат другой, затем ещё третьей итд.

anonymous
()
Ответ на: комментарий от Donnie_Darko

меньшей зависимости

bicycle

код не дублируется и при этом быстрее, да здравствует bicycle.

lolwhut?

лолкай дальше)

Бывает. Но я не столько не «не осилил», сколько не хочу видеть в своем коде, который буду через n месяцев редактировать вот такое:

import re
result = re.search('<title>(.*)</title>', page, re.IGNORECASE or re.DOTALL).group(1).strip()

в то время как мог написать так:

Нет, не так, а еще импорты в действующее пространство имён, чтоб код был такой короткий как у вас в сообщении :) А если нужно будет запустить результат на symbian, psion, etc? Устанавливать beautifulSoup? Чтоб она жрала память запуская import re вместо того чтобы самому распарсить страничку? Версии питона не всегда и далеко не последние при портировании. Многие библиотеки отсутствуют. Разве стоит удивляться что среди питон-кодеров так много тормозящих программ?

chinarulezzz ★★
()
Ответ на: комментарий от anonymous

Вот именно из-за проклятого перфекционизма и идеализма я и предлагаю брать сразу парсер, чтобы при расширении функциональности программы не заниматься костылями с регулярками.

1. регулярки документируются 2. исходить надо от задачи: в задаче парсер не нужен.

Может там надо будет условиями проверять найденные крупные блоки html-кода, тогда легче будет делать всё в одном цикле с if-ами, чем парсить сначала одной регуляркой, затем её результат другой, затем ещё третьей итд.

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

chinarulezzz ★★
()
Ответ на: комментарий от Chaser_Andrey

>Разбираешь DOM-дерево, делов-то.

Qt+QtWebKit


Причем тут вебкит О_о?! Есть QtXml, в исполнениях DOM и SAX. выбирай не хочу. Сам бы на баше сделал, если штука ничего уж слишком сложного уметь не должна.

erfea ★★★★★
()
Ответ на: комментарий от chinarulezzz

давай возьмем реальную задачу, а не магическую - «парсить чужые сайты с симбиана, который RIP».

у нас есть закрытая соцсеть(tm), которую надо распарсить. объем страниц - 1000000. Странички берем по 3 штуки за раз(чтоб заметную нагрузку на сервер не оказывать). В среднем одна страничка отдается за 5 сек. Получается работа на 462 часа. Парсим эти странички - 800 мс с супом, с регекспом в 3 раза быстрее. НО 800 мс < 5 секунд, который требуется но новый запрос! Зачем мне экономить мс, если сетевой wait и так в секундах! Через пару месяцев разраб уходит из проекта и оставляет код без регекспов. Хеппи Энд.

Donnie_Darko
()
Ответ на: комментарий от chinarulezzz

пиши на ассемблере, будь мужиком!

anonymous
()
Ответ на: комментарий от Donnie_Darko

давай возьмем реальную задачу, а не магическую - «парсить чужые сайты с симбиана, который RIP».

а теперь взгляни на заголовок и успокойся. Задача простая, делается и на баше, но тут вылезают питон-быдлокодеры и советуют использовать комбайн) Прям как дельфисты с компонентой, или дотнетчики с классом.

у нас есть закрытая соцсеть(tm), которую надо распарсить. объем страниц - 1000000. Странички берем по 3 штуки за раз(чтоб заметную нагрузку на сервер не оказывать).

просто сказочник) Миллион страниц от сервера по 3 штуки за раз. бугагага) xD

НО 800 мс < 5 секунд, который требуется но новый запрос! Зачем мне экономить мс, если сетевой wait и так в секундах!

т.е. понятие Queues вам не знакомо?

chinarulezzz ★★
()
Ответ на: комментарий от Donnie_Darko

Через пару месяцев разраб уходит из проекта и оставляет код без регекспов. Хеппи Энд.

разраб тормозящий в регэкспах - не разраб, и пусть эти быдлокодеры себя не успокаивают ^_^

P.S. anonymous: >пиши на ассемблере, будь мужиком!

смотря что это мне даст. Буду и на асме писать если нужно в какой-то задаче, проблем-то :)

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

>понятие Queues вам не знакомо?

знакомо и применяется в задаче. никто не говорит, что достает и парсит один и тот же скрипт. суть в том, что ВСЕГДА сетевой wait > расход времени на парсинг.

Donnie_Darko
()
Ответ на: комментарий от Donnie_Darko

суть в том, что ВСЕГДА сетевой wait > расход времени на парсинг.

тогда вы должны понять, что из этого утверждения, например совсем не значит что не надо сокращать время парсинга. Так как граббинг страниц и их парсинг можно делать асинхронно, с очередями, тредами, etc.

Да объём данных бывает разный. Парсинг к тому же может быть локальный.

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

chinarulezzz ★★
()
Ответ на: комментарий от Donnie_Darko

а если сетевой wait < расход времени на парсинг, то сервер парсер = сервер приложения и парсинг нафиг не нужен

а теперь по-русски. ^_^ Честно, не понял, можете пояснить?))

chinarulezzz ★★
()

Я удивлён.
Где местные гуру Ruby, почему ТС до сих пор не наставлен на путь истинный?

zolden ★★★★★
()
Ответ на: комментарий от zolden

>Где местные гуру Ruby, почему ТС до сих пор не наставлен на путь истинный?

И какой же истинный путь для данной задачи на руби?

anonymous
()
Ответ на: комментарий от chinarulezzz

>Так как граббинг страниц и их парсинг можно делать асинхронно, с очередями, тредами, etc.

Опять 25. Когда таргет находится не на локальном сервере, то время затраченное на получение контента с него больше, чем время потраченное на вытаскивание нужной информации с уже полученной страницы(неважно чем). Многие сайты валятся, когда их граббят в десять потоков. А отказоустойчивым не очень нравится отдавать 10 страниц/в секунду одному ip(прокси-лист, покупка доп. ip стоят денег). К этому добавьте то, что многие сайты теперь генерируются из яваскрипта и приходится для того, чтобы их обработать, делать не один запрос, а сдесяток и исполнять яваскрипт. Вот где настоящие тормоза.

Прям как дельфисты с компонентой, или дотнетчики с классом.

но тут вылезают питон-быдлокодеры


пусть эти быдлокодеры



Если вы верите, что уровень абстракции выше той, что вы привыкли использовать - обязательно приводит к быдлокодерству, то это необязательно соответствует правде.

Donnie_Darko
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.