Thursday, November 25th, 2010
Фантастика! А такие есть…. Пару дней назад рассматривая бегающих туда-сюда по блогу ботов наткнулся на – http://www.majestic12.co.uk/
Majestic-12 усердно работает над созданием World Wide Web поисковика основанного на концепции распределенных вычислений, таким же образом как и проекты типа SETI@home.
т.е. проект работает за счет того, что энтузиасты по всему миру расшаривают вычислительные ресурсы своих компьютеров помогая поисковику индексировать страницы. Отсюда следует немаловажный вывод – ботов нельзя отсечь используя список IP адресов, и бывает они создают достаточно серьезную нагрузку на ресурс который индексируют, заблокировать ботом можно только через robots.txt. Скачать клиента можно тут :
http://www.majestic12.co.uk/projects/dsearch/download.php
Поисковые технологии потихоньку развиваются, гуглу приходится все труднее т.к. со все сторон его атакуют различные набольшие проекты, конечно вряд ли он сдаст свои позиции в скором времени, но тем не менее здоровая конкуренция всегда идет на пользу рынку. У гугла сейчас есть крайне неприятная проблема – сайты контент-помойки, вроде ehow, mahalo и т.д. Уже недостаточно написать хорошую статью чтобы оказаться в топе поисковика, нужны кучи бэклинков – обычный человек никогда не будет этим заниматься, в то время как в топах зависают сайты с миллионами входящих бэков контент для которых пишут дешевые копирайтеры-индусы. В итоге что-то действительно полезное найти становится все труднее. И это как говорится – suck.

http://www.majestic12.co.uk/projects/dsearch/stats.php
Индекс Majestic-12 уже достаточно внушителен и динамика развития проекта радует глаз. Не такая уж новая идея распределенных вычислений идея была реализована и теперь у разработчиков в руках находится огромное кол-во данных для анализа. И они извлекают из этого какую-то прибыль – продают доступ на сервис http://www.majesticseo.com/
Posted in Cool Story Bro, Search Engine | No Comments »
Sunday, November 14th, 2010
Как написать многопоточный прокси чекер на Python? Как нефиг делать =) Я уже писал немного о том как проверять прокси на alive, с тех пор прошло много времени и чекер немного усовершенствовался. Изначально я передал материал на форум Privatetalks, но теперь пришло время пополнить им блог. Исходные ходы поставляются как есть, в отрыве от контекста, собственно для тех кто шарит не составит труда доработать и реализовать многопоточность (на ActiveState и StackOverflow есть уже готовые решения по этой части).
Все просто. Есть какая-то страница, которую нужно запрашивать через прокси, и проверят что там отдали. Помимо этой простейшей проверки на метод GET, есть еще проверки на POST и Cookie, некоторые прокси не держат, и поэтому часто бывают бесполезны для каких-то задач. Проверка на куки мне пока была не нужна, а вот проверку на POST я сделал.
TProxy – класс который обеспечивает работу с данными прокси. Такая тема в программировании называется – инкапсуляция.
На сервере нужно разместить несколько файлов с которыми будет взаимодействовать скрипт. Можно размещать и скрипт и эти файлы на одном сервере, я так и делал =) правда тогда будьте осторожны с многопоточностью у меня скрпит в 300 потоков бодро ложил апачи (не всегда, но бывало), на неслабом железе.
Предположим это index.php :
<html>
<head>
</head>
<body><h1>SIGNATURE</h1>
<h2>Real IP : xx.xx.xx.xx</h2>
<h2>IP : xx.xx.xx.xx</h2>
</body>
</html>
SIGNATURE – уникальный идентификатор страницы. должен совпадать с CHECK_STR. Еще нужно определить 2е “константы” CHECK_URL – урл где лежит вышеприведенная страница, и CHECK_MAX_TIMEOUT – максимальный таймаут (если отклик через прокси больше, то она помечается как bad) поставьте 2.0 для начала.
Как формируются Real IP и IP? Getting real IP address in PHP – вообщем с помощью этого кода нужно сформировать Real IP и IP.
А вот тут умные дядьки пишут как чекать геолокейшн – Check GEO Location. В принципе, я так понимаю таких сервисов много и можно долбить следующий если первый не вернул адекватный результат.
def check_proxy(proxy, need_country=False):
"""Check if proxy alive + anonymity and record proxy to file if we need this"""
ip = TProxy(proxy)
gt = urllib2.build_opener(urllib2.ProxyHandler({"http":ip.get_proxy()}))
start_time = time.time()
try:
result = gt.open(CHECK_URL, timeout=CHECK_MAX_TIMEOUT)
result = result.read()
except (urllib2.URLError, socket.timeout, httplib.BadStatusLine, httplib.InvalidURL):
ip.set_alive_status(False)
return ip
except:
ip.set_alive_status(False)
return ip
ip.set_alive_status(True)
ip.set_timout(time.time() - start_time) # proxy response time
# get ip and real ip values. check for anonymity
search = re.compile(CHECK_STR)
pattern = re.search(search, result)
if pattern != None:
ip.set_alive_status(True)
search = re.compile("IP : \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
ips = re.findall(search, result)
# extract ip and real ip values from page
if ips != []:
try:
real_ip = ips[0]
given_ip = ips[1]
if real_ip == given_ip:
ip.set_anonymous_status(True)
except:
ip.set_alive_status(False)
return ip
# check country
if need_country:
try:
response = gt.open('http://api.hostip.info/get_html.php?ip=%s' % ip.get_host(), timeout=5).read()
country = re.search('Country: (.*)', response)
if country <> "":
ip.set_country(country.group(1))
else:
ip.set_country('undefined')
except:
ip.set_country('undefined')
return ip
Теперь как проверить на POST.
def generate_random_str(length=10):
str = string.lowercase+string.digits
return ''.join(random.sample(str, length))
def check_proxy_for_post(proxy):
token = generate_random_str(20)
try:
gt = urllib2.build_opener(urllib2.ProxyHandler({"http":proxy}))
post_data = urllib.urlencode({'zpost' : token})
response = gt.open(CHECK_URL + "post.php", post_data, timeout=POST_MAX_TIMEOUT).read()
# check token
print response
search = re.compile(token)
pattern = re.search(search, response)
if pattern != None:
return True
else:
return False
except HTTPError, e:
print "Http error"
return False
except URLError, e:
print "Url error"
return False
except:
print "Unknown error"
return False
Легко встраивается в функцию check_proxy приведенную выше. Нужно только немножко пошевелить мозгами.
в файл index.php добавляется форма :
<form action="post.php" "method="post">
<input type="text" name="zpost" value="post check">
<input type="submit" value="Check POST method">
</form>
В ту же папочку аккуратно ложится файлик
<html>
<body>
<h1><?php echo $_POST["zpost"]; ?></h1>
</body>
</html>
Вообщем код легко собирается в готовый продукт, добавляются фичи по вашему вкусу и вперед ура.
Кстати говоря готовый код недавно обнаружил на гитхабе – чекер прокси. Оттуда тоже можно взять несколько идей.
А еще нужно не жадничать и быть аккуратным т.к. ДЦ может абузить по подозрению в Netscan.
Понравилась статья? Зарегайся на форуме privatetalks – общайся с профессионалами.
Posted in Code, Proxy | 1 Comment »
Saturday, November 13th, 2010
Заметил сегодня у себя в статистике бота который представлялся как dotBot и имел адрес http://www.dotnetdotcom.org/.
Наши цели.
Наши цели довольно просты. Мы хотим сделать интернет настолько открытым – насколько это возможно. На текущий момент только несколько избранных корпораций имеют полный и подходящий для использования иденкс веба. Наша цель – изменить этот факт, для этого наш бот собирает данный о вебе и мы публикуем как можно более полную информацию о структуре и контенте всемирной паутины. Мы планируем делать это так, чтобы перекрывать наши расходы (продажа индекса) и релизить его бесплатно – полезная штука для вебмастеров. Очевидно эта цель имеет множество потенциальных проблем с технической частью, легальностью, финансами и этикой. Вообщем мы пока будем работать и стараться сделать интернет среду как можно более открытой.
Техническая составляющая системы написана на C/Python с использованием libcurl. Авторы передают респект всему open source сообществу.
www.example.com/ HTTP/1.1 200 OK
Date: Sat, 20 Sep 2008 15:43:15 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Content-Length: 557
Connection: close
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>I am an example.</title>
</head>
<body>
...
<body>
</html>
www.example2.com/ HTTP/1.1 200 OK
Date: Sat, 20 Sep 2008 15:43:15 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Content-Length: 557
Connection: close
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>I am a different example.</title>
</head>
<body>
...
<body>
</html>
Там же можно скачать текущий индекс. Это 3.2 гигабайта в запакованном виде и более 14 гигов в распакованном. На данный момент индекс грубо говоря представляет собой урл и http-response (т.е. хтмл код страницы). Но даже из этого в принципе можно получить достаточно много интересной инфы, правда база достаточно большая и обработка её даже простыми операциями (например подсчет ссылок) может занять длительное время )
Posted in Cool Story Bro, Search Engine | No Comments »
Friday, November 12th, 2010
Прочитал вот это. На первый взгляд кажется – ну и что такого? Бот совершает покупки в онлайн шопе и пишет отчеты в твиттер. Тем не менее это инновация, способов применения ей можно найти массу, если приложить голову ) Такие разработки всегда привлекают внимание.
Итак собственно бот написан на Python и для поиска товаров использует API – http://developer.trademe.co.nz/api-documentation/. Бот запускается каждый день в 8 часов утра и имеет в день по 1$ “карманных денег”, котрые однако он может и не потратить (а может и потратить шанс 1/3), а сэкономить чтобы купить более дорогую покупку. Методы поиска :
Бот сканирует категории товаров, там он ищет слова – free shipping, и сортирует по самым новым поступлениям, но не более 100 итемов на категорию. Далее он сортирует по ценам стараясь потратить не больше 50% сбережений. Попутно проверяя предмет на уникальность. Полностью нехитрый алгоритм выглядит так.
The method it uses to select items:
- It has a bunch of top-level categories it looks in.
- For each of these categories, it searches for the term “Free shipping”, specifying both pay-now and buy-now, sorting by newest listings, with a maximum of 100 items returned per category.
- For each of these items, it filters on buy-now price. It tries to spend at least 50% of its savings.
- For each of the surviving items, it looks up the individual auction details to find its shipping information so it can filter on free shipping. Despite searching for the term ‘free shipping’ to start, only a small number of items have this.
- At this point I have a list of items that match the price requirements, and can be bought with a credit card buy-now.
- I then sort this list by ‘rarity’ – doing a search for the item title, and finding the item that returns the least results. As the objective here is to buy strange and esoteric things, rarity is preferred.
- Finally I buy the rarest item and subtract its cost from the bots savings.
Posted in Cool Story Bro, Fun | 2 Comments »