Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 14, 2013 12:25:36

spirAde
Зарегистрирован: 2013-08-02
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Здравствуйте! Есть скрипт, который меня в принципе всем устраивает, за исключением одной вещи, скрипт может намертво встать при попытке открыть 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 или чего-то подобного, но так ни к чему и не пришел. Просьба подсказать как выйти из данной ситуации, куда копать, кого пинать)
Заранее спасибо!

Отредактировано spirAde (Авг. 14, 2013 12:36:31)

Офлайн

#2 Авг. 14, 2013 12:36:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Копай многопоточность. Запускай всё это в дополнительном потоке, а в основном проверяй время выполнения.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Авг. 14, 2013 13:02:20

spirAde
Зарегистрирован: 2013-08-02
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Эх… сколько я не пытался в нее въехать, все никак не получалось) видимо пришло время серьезней подойти к многопоточности… Спасибо, Rodegast

Офлайн

#4 Авг. 14, 2013 14:41:38

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Может быть там как-нибудь в urllib настраиваются таймауты, чтобы оно само отваливалось если коннекта нет?



Офлайн

#5 Авг. 14, 2013 19:31:34

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Реализовать выход из цикла в случае зависания скрипта

import socket
socket.setdefaulttimeout(15)

Офлайн

#6 Авг. 14, 2013 20:51:45

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Может проще использовать requests?
http://docs.python-requests.org/en/master/user/advanced.html#proxies

Офлайн

#7 Авг. 14, 2013 22:36:15

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Реализовать выход из цикла в случае зависания скрипта

> Может проще использовать requests?
А ещё проще RTFM! Чё за проблема, я вообще не понимаю.

..bw



Офлайн

#8 Авг. 15, 2013 05:29:29

spirAde
Зарегистрирован: 2013-08-02
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Проблема в том, что фактически это первый скрипт, который был мною написан. Соответственно и знания мои ничтожно малы. Спасибо вам за помощь, проблема была решена через timeout.

Офлайн

#9 Авг. 16, 2013 20:27:30

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Реализовать выход из цикла в случае зависания скрипта

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version