Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 1, 2011 12:12:06

plurk89
От:
Зарегистрирован: 2011-06-09
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Каждый поток начинает очередь (Queue) сначала.

Написал граббер прокси с веб страничек. И решил я добавить этому парсеру многпоточность. Всё вроде бы работает, но каждый поток упорно начинать брать урлы из очереди сначала.
Код был бы на много короче (1 регулярка), но написаны функции для обработки сайтов с “защитой” от автоматического граббинга.

#!/usr/bin/env python

import re, urllib, urllib2, ConfigParser, threading, time
from string import split
from Queue import Queue

file = open('list.txt' , 'r')
s_list = file.readlines()
file.close()

config = ConfigParser.RawConfigParser()
config.read('config.cfg')

cookie = config.getint('Cookie', 'cookie')

queue = Queue()

LOCK = threading.RLock()

def main():
print 'Started'
threads = config.getint('Threads', 'threads')
for i in xrange(len(s_list)):
queue.put(s_list[i])
for _ in xrange(threads):
thread_ = threading.Thread(target=worker)
thread_.start()
while threading.activeCount() > 1:
time.sleep(1)
print "Finished"

def worker():
while True:
try:
target_link = queue.get_nowait()
except Queue.Empty, error:
return
parsed_data = pars(target_link)
if parsed_data == "ERROR":
queue.put(target_link)

def hidemyass(url):
sock2 = urllib2.urlopen(url)
mata = sock2.read()
sock2.close()
many = 0
rem = re.findall('(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', mata, re.DOTALL)
rem1 = re.findall('\n(?:[\d]{1,6})</td>', mata, re.DOTALL)
for n in range(len(rem)):
good = rem[n] + ':' + rem1[n][1:].replace('</td>', '')
open("proxy.txt", "a+").write(good + '\n')
many = many + 1
print url + ' parsed ' + str(many) + ' proxy'

def nntime(url):
sock = urllib2.urlopen(url)
data = sock.read()
sock.close()
ip = re.findall('<td>((?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3}))<script', data, re.DOTALL)
port = re.findall('<script type="text/javascript">document.write\(":"(.+?)\)</script></td>', data, re.DOTALL)
digit0 = re.findall('([a-z])=0', data, re.DOTALL)
digit1 = re.findall('([a-z])=1', data, re.DOTALL)
digit2 = re.findall('([a-z])=2', data, re.DOTALL)
digit3 = re.findall('([a-z])=3', data, re.DOTALL)
digit4 = re.findall('([a-z])=4', data, re.DOTALL)
digit5 = re.findall('([a-z])=5', data, re.DOTALL)
digit6 = re.findall('([a-z])=6', data, re.DOTALL)
digit7 = re.findall('([a-z])=7', data, re.DOTALL)
digit8 = re.findall('([a-z])=8', data, re.DOTALL)
digit9 = re.findall('([a-z])=9', data, re.DOTALL)
for q in range(len(port)):
good = port[q].replace('+', '').replace(digit0[0], '0').replace(digit1[0], '1').replace(digit2[0], '2').replace(digit3[0], '3').replace(digit4[0], '4').replace(digit5[0], '5').replace(digit6[0], '6').replace(digit7[0], '7').replace(digit8[0], '8').replace(digit9[0], '9')
proxy = ip[q] + ':' + good
open("proxy.txt", "a+").write(proxy + '\n')
print url + ' parsed ' + str(len(ip)) + ' proxy\n'

def topgen(url):
sock = urllib2.urlopen(url)
data = sock.read()
sock.close()
res = re.findall('type=\"text/javascript\">document.write((.+?))</script>', data, re.DOTALL)
char6 = re.findall('<script type="text/javascript">\n(.+?)="6";', data, re.DOTALL)
char6=str(char6)[2:-2]
char3 = re.findall('="6";\n(.+?)="3";', data, re.DOTALL)
char3=str(char3)[2:-2]
char7 = re.findall('="3";\n(.+?)="7";', data, re.DOTALL)
char7=str(char7)[2:-2]
char9 = re.findall('="7";\n(.+?)="9";', data, re.DOTALL)
char9=str(char9)[2:-2]
char2 = re.findall('="9";\n(.+?)="2";', data, re.DOTALL)
char2=str(char2)[2:-2]
char8 = re.findall('="2";\n(.+?)="8";', data, re.DOTALL)
char8=str(char8)[2:-2]
char1 = re.findall('="8";\n(.+?)="1";', data, re.DOTALL)
char1=str(char1)[2:-2]
char4 = re.findall('="1";\n(.+?)="4";', data, re.DOTALL)
char4=str(char4)[2:-2]
char0 = re.findall('="4";\n(.+?)="0";', data, re.DOTALL)
char0=str(char0)[2:-2]
char5 = re.findall('="0";\n(.+?)="5";', data, re.DOTALL)
char5=str(char5)[2:-2]
reg = str(res)[2:-2]
reg = reg.replace('+','').replace('\"','').replace(char6,'6').replace(char3,'3').replace(char7,'7').replace(char9,'9').replace(char2,'2').replace(char8,'8').replace(char1,'1').replace(char4,'4').replace(char0,'0').replace(char5,'5').replace(')\'),','\n').replace(')\'', '\n').replace(' \'(' ,'').replace('(', '').replace(',','').replace('\'', '').replace(' ','')
open("proxy.txt", "a+").write(reg[1:-1] + '\n')
set = len(reg.split('\n')) - 1
print url + ' parsed ' + str(set) + ' proxy'

def proxyforest(url):
sock = urllib2.urlopen(url)
data = sock.read()
sock.close()
res = re.findall('([1-4],\'.*?\',\'.*?\',\'.*?\',\'.*?\',[0-9]{1,4})', data, re.DOTALL)

for i in range(len(res)):
pars = res[i]
if str(pars)[0] == '4':
repars = pars.split(',')
good = repars[2] + '.' + repars[3] + '.' + repars[4] + '.' + repars[1] + ':' + repars[5]
good = good.replace("'", "")
open("proxy.txt", "a+").write(good + '\n')
elif str(pars)[0] == '3':
repars = pars.split(',')
good = repars[3] + '.' + repars[4] + '.' + repars[1] + '.' + repars[2] + ':' + repars[5]
good = good.replace("'", "")
open("proxy.txt", "a+").write(good + '\n')
elif str(pars)[0] == '2':
repars = pars.split(',')
good = repars[4] + '.' + repars[1] + '.' + repars[2] + '.' + repars[3] + ':' + repars[5]
good = good.replace("'", "")
open("proxy.txt", "a+").write(good + '\n')
elif str(pars)[0] == '1':
repars = pars.split(',')
good = repars[1] + '.' + repars[2] + '.' + repars[3] + '.' + repars[4] + ':' + repars[5]
good = good.replace("'", "")
open("proxy.txt", "a+").write(good + '\n')
print url + ' parsed ' + str(len(res)) + ' proxy'

def xroxy(url):
sock = urllib2.urlopen(url)
data = sock.read()
sock.close()
many = 0
ip = re.findall('<td><a href=\'proxy:name=XROXY proxy&host=(.+?)&port=', data, re.DOTALL)
port = re.findall('&port=(.+?)&notes=', data, re.DOTALL)
for i in range(len(ip)):
good = ip[i] + ':' + port[i]
open("proxy.txt", "a+").write(good + '\n')
many = many + 1
print url + ' parsed ' + str(many) + ' proxy'

def normal(url):
page_open = urllib2.urlopen(page)
source = page_open.read()
page_open.close
proxy = re.findall('(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\:(?:[\d]{1,4})', source, re.DOTALL)
for x in range(len(proxy)):
open("proxy.txt", "a+").write(proxy[x] + '\n')
print page + ' parsed ' + str(len(proxy)) + ' proxy'

if cookie == 1:
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPCookieProcessor))

def pars(url):
for i in range(len(s_list)):
page = s_list[i]
if page.find('topgen')>0:
topgen(page)
elif page.find('proxyforest.com')>0:
proxyforest(page)
elif page.find('xroxy.com')>0:
xroxy(page)
elif page.find('hidemyass.com')>0:
hidemyass(page)
elif page.find('nntime')>0:
nntime(page)
else:
normal(page)

if __name__ == "__main__":
main()

raw_input()
приму замечания по коду



Отредактировано (Сен. 1, 2011 12:14:15)

Офлайн

#2 Сен. 2, 2011 16:09:45

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Каждый поток начинает очередь (Queue) сначала.

У тебя функция pars принимает url, но его совсем не использует. Вместо этого пробегает весь список. И еще она ничего не возвращает, хотя от неё ждут parsed_data.



Офлайн

#3 Сен. 2, 2011 20:11:15

plurk89
От:
Зарегистрирован: 2011-06-09
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Каждый поток начинает очередь (Queue) сначала.

Спасибо большое. Смотрел куда угодно, но не туда=)



Отредактировано (Сен. 2, 2011 21:17:17)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version