Pull to refresh

Comments 56

по меньшей мере странно прыгать от одного языка к другому учитывая что питон все эти вещи легко выполняет.
Но эта же вещь легче выполняется в другом, кроме того, это была разминка для хвоста, поэтому разные языки.
with  open("file.txt", "w") as f:
    f.write("\n".join(list(set(usersStr.split("\n\r")))))

Легче этого??
Ну или я не в достаточной мере дружу с питоном. Каюсь, возможно, в некоторых местах, можно было бы сделать все лучше. Буду исправляться!
Я бы своим за такой «лисп стайл» руки поотрывал бы =) Ну пара вложеных функций еще ладно, но 5 это уже большой перебор.
В этом же и прелесть python, разве нет?
Нет, такой говнокод можно на любом языке написать, от названия языка он красивей не станет, и у автора статьи хоть и длинней но код понятней и приятней.
Вполне читается. Вы излишне придирчивы.
Если в лист не оборачивать тоже будет работать, кстати.

with  open("file.txt", "w") as f:
    f.write("\n".join(set(usersStr.split("\n\r"))))

ждал этот комментарий, тоже заметил это после того как написал
На php, кстати, можно ещё легче, чем у вас, см. file() и implode() :)
Получилась хабраверификация сайтов)

А все пользователи были проверены в итоге или есть вероятность, что у кого-то сайт был пропущен?
Даже больше скажу, большая часть пользователей была пропущена) Я подрегулирую эту систему, и запущу еще раз, полностью в автоматическом режиме, вот тогда будут проверены все сайты. Я надеюсь.
Может выложить список проверенных сайтов? Или это чревато?
Чревато. Может быть кто-то не поправил еще. Давайте не будем показывать все это. Тем более, что это чьи-то ошибки, а на ошибки, как правило, указывают лично.
А проверенночистые сайты? Тоже не стоит?
Большой список. Думаете есть смысл? Смотреть на чистые сайты. К примеру в одном из профилей был найден yandex, и я смотрел 15 минут на то, как сканировался yandex. Немного напрягло.
А так непонятно просто: или ты чистый, или не проверили.
Как только все обновлю, все проверю, будет подробный пост с разбором уязвимостей. Надеюсь всем понравится.
Тогда уж просите инструкцию как самому проверить (я про скрипт для BackTrack r3), и делайте самостоятельно проверки с некоторой периодичностью.
Думаю стоит создать blacklist — куда надо вписать ya.ru, mail.ru, od.ru vk и прочие сайты.
А список ошибок сразу в личку скриптом кидать :)
Может быть. Только теперь мне нужно это все совместить в одну программу, и затем сделать вторую часть статьи.
Кстати отличная мысль. Эдакий жест доброй воли (почти) мирового масштаба. Это однозначно зачтется в карму. :)
Пункт второй: Уникализировать

with open('habrs.txt') as in_f:
    users = in_f.readlines()

users = [ user.strip() for user in users]
users = set(users)

with open('habrs.txt', 'w') as out_f:
    for user in users:
        out_f.write(user)
        out_f.write('\n')


Спасибо большое. Будет использовано в общей программе.
Уникализировать
$ sort -u habrs.txt >habrs_uniq.txt
В redis есть sets и не нужно никаких проверок на дублирование делать.
Вопрос только в том, что мешает использовать те же sets в питоне?
можно сразу искать сет нужного размера, а потом уже его в файл, как-нибудь так:

import urllib2, re

def going(names,users = set(),limit=None):
    for name in names:
        page = urllib2.urlopen("http://habrahabr.ru/users/%s/subscription/followers/"%name).read()
        names = set(re.findall('<div class="username"><a href="/users/(.*?)/">', page))                
        users|=names
        if len(users)>=limit:
            return users
    return going(list(names),users,limit)

all_names=going(['grokru'],limit=100)
Вообще побольше бы статей по питону и комментариев с примерами «так делать лучше» или «так делать нельзя».
вы только на мой пример не смотрите. у автора поста в программе ошибка — неправильно построенная рекурсия, а я её не подумав скопировал. обе программы будут работать, но некорректно, почём зря отбрасывая кучу веток дерева перебора, а написать нормально сейчас нет времени — завал на работе полнейший.

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

import urllib, re

def find_users(limit):
    users=set()
    for i in xrange(200000):
        page=urllib.urlopen("http://habrahabr.ru/post/%s"%i).read()
        users|=set(re.findall("http://habrahabr.ru/users/([a-zA-z0-9]+)/",page))
        if len(users)>=limit:
            return sorted(users)

Хотя нет, это долго и нудно.
Вот ультимативное решение, возвращает 76 с лишним тысяч подписчиков хаба «Информационная безопасность», как раз то, что надо :)
import urllib, re

def find_users():
    users=[]
    for i in xrange(1,1537):
        url="http://habrahabr.ru/hub/infosecurity/subscribers/rating/page%s/"%i
        page=urllib.urlopen(url).read()
        users+=re.findall('<a href="/users/[a-zA-Z0-9]+/">',page)
    return users
скобки забыл
users+=re.findall('<a href="/users/([a-zA-Z0-9]+)/">',page)
Теперь осталось разослать пользователям информацию о найденных уязвимостях, чтобы они её исправили.
Некоторым разослал, более детальная информация будет после следующего поста. С доработанной программой.
Блин, я в проверку не успел попасть :(
Для php поместить каждую не пустую строчку из файла в массив:
$arr = file('example.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
Ну ценность перебора спорная, но за наводку на nikto — большое спасибо.
В дистрибутиве BT есть более продвинутый сканер, но наводить я на него не буду, достаточно попробовать их все, чтобы понять, для чего служит каждый.
разминка для хвоста, это все понятно…
но:
1. при записи после уникализации — в php отменили implode?
2. при чистке сайтов, с какой великой целью используется метод чтения файла в строку и разбитие ее на массив, если есть функция file, которая вернет сразу массив?
Непонятными действами занимался, я уже покаялся по этому поводу. Буду исправляться.
1. Пишем у себя в профиле сайт конкурента
2. Ждем результатов проверки
3. ???
4. PROFIT
Круто вам. Только один конкурент… :)
Если PROFIT -> помочь конкуренту найти уязвимости, то да :-)
Исходя из каких побуждений был выбран обход в глубину при парсинге хабралюдей? Ведь тут без отсечений будет бесконечная рекурсия. Или правило шести рукопожатий работает и на хабре? И каким образом выбирается первый пользователь?
Рандомно, обход был выбран не очень удачно, признаю. Я толкнул идею. Вдруг кто-то загорится? Будет продолжение с более продуманными решениями.
Было бы проще через приглашённых на сайт, но к сожалению профиль НЛО закрыт =(
C os.system, pidof в файл, чтение файла и внешний kill это конечно кромешно. subprocess и запустит правильно, и pid получит, и кильнуть поможет. И никаких лишних внешних вызовов, файлов и прочего.

Зачем понадобилось перед рекурсивным вызовом going отдельно получать список names, можно же передать start сразу ей:
going([start])
Не все так просто, чтоб вы знали… На странице /users лежит не так много, как хочется, пользователей. Решено было рекурсивно идти по юзерам и брать там из подписчиков других юзеров, а там еще юзеров и еще…


Scrapy
Не битрикс, насколько я помню.
Sign up to leave a comment.

Articles