#!/usr/bin/python import urllib2 import urllib import socket import sys import time import random import re import os import mechanize import cookielib proxylisttext = "proxylist.txt" #ip:port user_agents = ['Mozilla/4.0 (compatible; MSIE 5.0; SunOS 5.10 sun4u; X11)', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100207 Ubuntu/9.04 (jaunty) Namoroka/3.6.2pre', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser;'] #list http-referrer referers = [http://www.example.ru/3, http://www.example.ru/2, http://www.example.ru/1] link_clicks = [http://www.example.ru/b/1, http://www.example.ru/b/2, http://www.example.ru/b/3] link_views = [http://www.example.ru/a/1, http://www.example.ru/a/2, http://www.example.ru/a/3] def is_bad_proxy(pip): try: proxy_handler = urllib2.ProxyHandler({'http': pip}) opener_check = urllib2.build_opener(proxy_handler) opener_check.addheaders = [('User-agent', 'Mozilla/5.0')] urllib2.install_opener(opener_check) req = urllib2.Request('http://www.google.com') sock = urllib2.urlopen(req) except urllib2.HTTPError, e: print 'Error code: ', e.code return e.code except Exception, detail: print "ERROR:", detail return True return False def bot(curr_proxy, referer, user_agent, is_clicked): try: cj = cookielib.CookieJar() proxy = curr_proxy.split(":") proxy_set = urllib2.ProxyHandler({"http" : "%s:%d" % (proxy[0], int(proxy[1]))}) opener = urllib2.build_opener(proxy_set, urllib2.HTTPHandler, urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [('User-agent', user_agent), ('Referer', referer)] urllib2.install_opener(opener) link = random.choice(link_clicks) if is_clicked == False else random.choice(link_views) f = urllib2.urlopen(link) if f.getcode() == 200: print "[*] Link %s worked..." % link f.close() else: print "[*] Link %s not worked !" % link print "[!] Proxy failed" cj.clear() except: print "[!] Proxy Error " pass def loadproxy(): try: get_file = open(proxylisttext, "r") proxylist = get_file.readlines() count = 0 proxy = [] while count < len(proxylist): proxy.append(proxylist[count].strip()) count += 1 for i in proxy: if is_bad_proxy(i): print "Bad Proxy %s" % (i) else: print "%s is working" % (i) user_agent = random.choice(user_agents) referer = random.choice(referers) rnd = random.randint(3, 5) counter = 0 print 'Bot Using Proxy :', i while counter <= rnd: bot(i, referer, user_agent, False) if counter == 0 or counter == 1 else bot(i, referer, user_agent, True) counter += 1 time.sleep(random.randint(1, 5)) print '###############################################################################' except IOError: print "\n[-] Error: Check your proxylist path\n" sys.exit(1) def main(): loadproxy() if __name__ == '__main__': main()
Вопрос собственно в том, как реализовать выход из цикла(заставить взять другой прокси) скажем, если скрипт не может открыть url уже N минут? Причем бывает так, что даже после проверки на is_bad_proxy он может намертво встать за 2-3 попытке открыть link_views или link_clicks(видимо прокси отмирает совсем). Проблема в том, что часто ставлю скрипт на ночь, и очень обидно видеть с утра, что скрипт встал через 30 минут после того, как я утопал спать).
Копал в сторону real-time counter или чего-то подобного, но так ни к чему и не пришел. Просьба подсказать как выйти из данной ситуации, куда копать, кого пинать)
Заранее спасибо!