22 нояб. 2012 г.

Собираем прокси лист для grab

Grab - фреймворк для парсинга сайтов, умеет работать через прокси сервера. В документации заявлено, что grab в принципе может сам брать сервера из файла-списка, сам может выбирать случайный, сам может менять сервера от запроса к запросу (Grab documentation. Работа с прокси-серверами).
Ниже скрипт для сбора этого списка с spys.ru - так проще, чем собирать список из поисковиков, а потом еще постоянно мониторить не отвалился ли какой-нибудь из серверов.

# -*- coding: utf-8 -*-

import os
import sys
import re
from grab import Grab, GrabError
from urllib import quote
from iptools import validate_ip


def parse():
    g = Grab()
    g.go('http://spys.ru/')
    rex = re.compile(r'(?:(?:[-a-z0-9]+\.)+)[a-z0-9]+:\d{2,4}')
    f = open(os.path.join(sys.path[0], 'proxy_list.txt'), 'w')
    for proxy in rex.findall(g.css_text('body')):
        ip, port = proxy.split(':')

        if len(ip.split('.')[0]) >= 4:  # на spys.ru для секурности дописывают двухсимвольную фигню в начало.
            ip = ip[2:]
            proxy = proxy[2:]

        if validate_ip(ip):
            g.setup(proxy=proxy, proxy_type='http', connect_timeout=5, \
                    timeout=5)
            try:
                g.go('http://www.apple.com/')
                try:
                    h1 = g.xpath_text("//h1")
                    if h1 in ['ERROR', 'Proxy Authentication Required']:
                        continue
                except Exception, e:
                    print e

                if g.response.code == 200:
                    print proxy.ljust(20), 'OK  ', g.response.code
                    f.write(proxy + '\n')

            except GrabError:
                print proxy.ljust(20), 'FAIL'
    f.close()

if __name__ == '__main__':
    parse()

9 нояб. 2012 г.

bitbucket в твоем домене

Не знаю видел ли ты, дорогой читатель, не очень новую, но очень полезную функцию bitbucket - привязка своего домена? Вместе с командными кабинетами эта функция позволяет за считанные секунды создать для команды общее хранилище репозиториев, issue tracker, wiki и много-много еще чего полезного...
Если у вас уже есть репозитории, которые не плохо было бы отдать команде, не беда - можно перенести их в аккаунт команды за несколько кликов в панели управления.
Членам команды могут быть назначены разные уровни доступа. Для деплоймента теперь можно создавать отдельные ssh-ключи, которым будет разрешен только pull.
Что тут скажешь? Глобализация. У разработчиков все меньше и меньше поводов обзаводится собственными серверами, а стартапы теперь можно начинать и вовсе без денежных вложений.

Примеры bitbucket'а на своем домене:


Тут можно создать команду: https://bitbucket.org/account/create-team/.

Подробней об этой и прочих фичах можно почитать по ссылке http://go-dvcs.atlassian.com/display/aod/Configuring+a+Bitbucket+account+for+your+team.