Комментарии 56
по меньшей мере странно прыгать от одного языка к другому учитывая что питон все эти вещи легко выполняет.
Но эта же вещь легче выполняется в другом, кроме того, это была разминка для хвоста, поэтому разные языки.
with open("file.txt", "w") as f:
f.write("\n".join(list(set(usersStr.split("\n\r")))))
Легче этого??
Ну или я не в достаточной мере дружу с питоном. Каюсь, возможно, в некоторых местах, можно было бы сделать все лучше. Буду исправляться!
Я бы своим за такой «лисп стайл» руки поотрывал бы =) Ну пара вложеных функций еще ладно, но 5 это уже большой перебор.
Если в лист не оборачивать тоже будет работать, кстати.
with open("file.txt", "w") as f:
f.write("\n".join(set(usersStr.split("\n\r"))))
На php, кстати, можно ещё легче, чем у вас, см. file() и implode() :)
Получилась хабраверификация сайтов)
А все пользователи были проверены в итоге или есть вероятность, что у кого-то сайт был пропущен?
А все пользователи были проверены в итоге или есть вероятность, что у кого-то сайт был пропущен?
Даже больше скажу, большая часть пользователей была пропущена) Я подрегулирую эту систему, и запущу еще раз, полностью в автоматическом режиме, вот тогда будут проверены все сайты. Я надеюсь.
Может выложить список проверенных сайтов? Или это чревато?
Чревато. Может быть кто-то не поправил еще. Давайте не будем показывать все это. Тем более, что это чьи-то ошибки, а на ошибки, как правило, указывают лично.
А проверенночистые сайты? Тоже не стоит?
Большой список. Думаете есть смысл? Смотреть на чистые сайты. К примеру в одном из профилей был найден yandex, и я смотрел 15 минут на то, как сканировался yandex. Немного напрягло.
А список ошибок сразу в личку скриптом кидать :)
Пункт второй: Уникализировать
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')
можно сразу искать сет нужного размера, а потом уже его в файл, как-нибудь так:
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 с лишним тысяч подписчиков хаба «Информационная безопасность», как раз то, что надо :)
Вот ультимативное решение, возвращает 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
Теперь осталось разослать пользователям информацию о найденных уязвимостях, чтобы они её исправили.
Некоторым разослал, более детальная информация будет после следующего поста. С доработанной программой.
Блин, я в проверку не успел попасть :(
Для php поместить каждую не пустую строчку из файла в массив:
$arr = file('example.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
Ну ценность перебора спорная, но за наводку на nikto — большое спасибо.
разминка для хвоста, это все понятно…
но:
1. при записи после уникализации — в php отменили implode?
2. при чистке сайтов, с какой великой целью используется метод чтения файла в строку и разбитие ее на массив, если есть функция file, которая вернет сразу массив?
но:
1. при записи после уникализации — в php отменили implode?
2. при чистке сайтов, с какой великой целью используется метод чтения файла в строку и разбитие ее на массив, если есть функция file, которая вернет сразу массив?
1. Пишем у себя в профиле сайт конкурента
2. Ждем результатов проверки
3. ???
4. PROFIT
2. Ждем результатов проверки
3. ???
4. PROFIT
Исходя из каких побуждений был выбран обход в глубину при парсинге хабралюдей? Ведь тут без отсечений будет бесконечная рекурсия. Или правило шести рукопожатий работает и на хабре? И каким образом выбирается первый пользователь?
Рандомно, обход был выбран не очень удачно, признаю. Я толкнул идею. Вдруг кто-то загорится? Будет продолжение с более продуманными решениями.
вот здесь решение попроще:
habrahabr.ru/post/191434/#comment_6653168
habrahabr.ru/post/191434/#comment_6653168
Было бы проще через приглашённых на сайт, но к сожалению профиль НЛО закрыт =(
C os.system, pidof в файл, чтение файла и внешний kill это конечно кромешно. subprocess и запустит правильно, и pid получит, и кильнуть поможет. И никаких лишних внешних вызовов, файлов и прочего.
Зачем понадобилось перед рекурсивным вызовом
Зачем понадобилось перед рекурсивным вызовом
going
отдельно получать список names
, можно же передать start
сразу ей:going([start])
5 пункт — это часом не битрикс был?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Поиск уязвимостей у хабросайтов