Найти - Пользователи
Полная версия: Реализовать выход из цикла в случае зависания скрипта
Начало » Python для новичков » Реализовать выход из цикла в случае зависания скрипта
1
spirAde
Здравствуйте! Есть скрипт, который меня в принципе всем устраивает, за исключением одной вещи, скрипт может намертво встать при попытке открыть url под проксей.

#!/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 или чего-то подобного, но так ни к чему и не пришел. Просьба подсказать как выйти из данной ситуации, куда копать, кого пинать)
Заранее спасибо!
Rodegast
Копай многопоточность. Запускай всё это в дополнительном потоке, а в основном проверяй время выполнения.
spirAde
Эх… сколько я не пытался в нее въехать, все никак не получалось) видимо пришло время серьезней подойти к многопоточности… Спасибо, Rodegast
Soteric
Может быть там как-нибудь в urllib настраиваются таймауты, чтобы оно само отваливалось если коннекта нет?
lorien
import socket
socket.setdefaulttimeout(15)
Alen
Может проще использовать requests?
http://docs.python-requests.org/en/master/user/advanced.html#proxies
bw
> Может проще использовать requests?
А ещё проще RTFM! Чё за проблема, я вообще не понимаю.

..bw
spirAde
Проблема в том, что фактически это первый скрипт, который был мною написан. Соответственно и знания мои ничтожно малы. Спасибо вам за помощь, проблема была решена через timeout.
o7412369815963
можете заюзать сигналы http://docs.python.org/2/library/signal.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB