подскажите, как осуществить нужно спарсить страницу так, чтобы она загрузилась с моими параметрами в исходном коде например: исходная стараница идет с Code: <INPUT type="hidden" name="nomer" value="123456"> а мне нужно чтобы было Code: <INPUT type="hidden" name="nomer" value="654321"> и после этого, я еще должен передать остальные параметры, вместе с этим
Code: import re link_text = re.sub(ur'<INPUT type="hidden" name="nomer" value="(.+?)">', '<INPUT type="hidden" name="nomer" value="654321">', link_text) слегка по быдлокодерски, но регулярки у меня всегда так получаются
заметил такую особенность пишу логин для сайта если захожу с браузера и логинюсь им же, то скрипт нормально заходит, пишет что акк зашел а если не зайти до этого, с браузера, то скрипт не заходит мой браузер и юзер-агент совпадают Code: #!/usr/bin/env python import urllib2, urllib, re, cookielib cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) urllib2.install_opener(opener) headers = {"User-Agent" : "Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)" } login = 'wtfuck2' password = '41257005' url = 'http://sait_so_vhodom.ru' params = urllib.urlencode({POST ZAPROS}) sock = urllib2.urlopen(urllib2.Request(url, params, headers)) data = sock.read() data = str(data)[2:-2] if data.find('open_help_gallery')>0: print login + ':' + password + ' - good' else: print login + ':' + password + ' - bad' из-за чего это, и как быть
Проблема, есть парсер по урлам (урлы берем) из файла и вот если воспользоваться им в запросе просто выбрасывает ерорры, если содать переменную то все ок. єто то что парсит Code: from __main__ import success import urllib.request, urllib.parse, urllib.error web = "web.txt" f_success = "success.txt" f_plugin = "plugin.txt" max_count_thead = 1 def run(url): req = urllib.request.Request(url,) print(url) r = urllib.request.urlopen(req) print(r.code) это мы вызываем Code: import _thread def success(text): global f_success f_success.write(text+"\n") f_success.flush() def run_test(site): global count_thead fi = open(scan.f_plugin,'r') plug_list = fi.readlines() while ( len(plug_list)>0): plug = plug_list.pop() str(site) url = site+'/url/'+plug scan.run(url) print(len(plug_list)) count_thead -= 1 test_site = 'base' scan = __import__(test_site) count_thead=0 fi = open(scan.web,'r') site_list = fi.readlines() print(site_list) f_success = open(scan.f_success,'w') while ( len(site_list)>=0): if (scan.max_count_thead > count_thead): site = site_list.pop() print(site) print(site_list) count_thead +=1 _thread.start_new_thread(run_test,(site,)) else: pass прошу сильно не бить =)! только начал учить python3 имаг с эроррами. [IMG="http://img545.imageshack.us/img545/4593/72798165.jpg"][/IMG]
переписал скрипт под 2.7 питон, но как вот избавиться от urllib который подвис потому что страничка непомерно большая?!
а как ты пришел к этому выводу? вообще можно попробывать urllib2 или grab(curl) или scrapy(про не ехз на самом деле, просто очередной интерфейс для парсинга с плюшками своими)
Изменение строки в текстовом файле Добрый день. Есть файл test.txt, содержащий, предположим, несколько строк: one two three four Есть желание заменить одну отдельную строку из этого файла на новую, например, «two» на «updated». Есть вариант просто тупо прочитать весь файл в список, изменить нужный элемент списка и сохранить начисто в файл этот список. Но такое решение кажется мне не совсем спортивным. По идее, как вариант, нам здесь может помочь метод объекта файла seek(), про который говорится в help: То есть по идее этот метод с параметром whence=SEEK_CUR позволит нам осуществлять относительное позиционирование в файле, а это вроде как раз то, нам нужно. Пробуем: Code: >>> file = open('test.txt', 'r+', encoding = 'utf-8') >>> for line in file: if line.strip() == 'two': file.seek(-len(line), 1) file.write('updated' + '\n') Получаем в ответ: Traceback (most recent call last): File "<pyshell#44>", line 3, in <module> file.seek(-len(line), 1) io.UnsupportedOperation: can't do nonzero cur-relative seeks То есть метод seek(x, 1) у меня не работает вообще, постоянно выдает такую ошибку, даже в более простых случаях. Гуглил эту ошибку, находил подобные сообщения, но решения так и не нашел. То ли баг, то ли еще что. Если что: Python 3.2.1 Win7Pro x64 Итак, вопросы: 1. Что не так с методом seek()? 2. Может есть другие варианты замены отдельной строки в файле?
Вы ведь понимаете, что строки в файлах - это абстракция? Если вам нужно заменить "two\n" на "updated\n", то все остальное содержимое тоже нужно будет сдвинуть на 4 символа. Попробуйте представить "one\ntwo\nthree\nfour\n", если так будет проще. гуглится это:
Спасибо за ответ. Значит, получается, что остается единственный вариант — считывать файл в список, менять его и записывать в файл целиком обратно?
Python & SQLite — замедление работы из-за увеличения размера базы Добрый вечер, господа. Есть скрипт, в котором работа блэклиста реализована при помощи SQLite. В связи с этим столкнулся с неприятной проблемой: чем больше размер базы блэклиста, тем медленнее работает скрипт. Например, увеличение размера базы с 0 до 17МБ снижает производительность программы на ~40%. По идее так не должно быть, ведь грош цена такой базе, которая так плохо относится к расширению. Следовательно, дело в коде. А кода тут буквально пару строк и где тут можно накосячить, я не знаю. Но, судя по всему, у меня это отлично получилось . Поэтому прошу вас взглянуть на код и сказать, что же я делаю не так. Может запросы кривые или еще что. От базы мне нужно только положить id юзера в базу и потом спросить, имеется ли какой-нибудь id в этой базе. Итак, в основном потоке база открывается: Code: import threading, sqlite3 lock = threading.Lock() con = sqlite3.connect('bl.db', check_same_thread = False) cur = con.cursor() cur.execute('create table if not exists bl_table (bl_name text)') А далее в двух функциях (скрипт многопоточный и в каждом потоке есть свои собственные такие функции) всего в двух местах идет обращение к этой базе. 1. Так выглядит обращение к блэклисту в функции сбора юзеров: Code: # собрали список юзеров, в цикле сверяем их с блэклистом with lock: cur.execute('select bl_name from bl_table where bl_name = ?', (user, )) rs = cur.fetchone() if rs: # юзер есть в блэклисте, удаляем его ... 2. И вот запись юзера в блэклист в функции отправки сообщения: Code: with lock: cur.execute('insert into bl_table (bl_name) values (?)', (user, )) con.commit() Вот собственно и все. Сначала, когда блэклист только создается, все работает быстро, а потом по мере увеличения размера базы данных все постепенно тухнет и тухнет. Хотелось бы узнать, почему так? P.S. Вопрос-бонус: объект Lock() может быть один глобальный на весь скрипт или надо для каждого потока создавать свой собственный Lock() и использовать его свой в каждом потоке?
cactuar И правда работает? Питон не позволяет обращаться к одному экземпляру подключения к базе/курсору sqlite из разных потоков. Создайте индекс на столбец по которому ищете, иначе каждый раз происходит полный поиск по всей таблице. Насчет P.S. - уникальный объект threading.Lock для каждого потока - не имеет смысла, подумайте сами почему.
Gifts, крайне благодарю за ответ. Да, правда работает Если при создании connection указать параметр check_same_thread = False, то python милостиво сжалится и разрешит обращаться к базе с разных потоков. Спасибо за дельный совет. Я правда пока не понял, что это значит, но спасибо за направление. Наверное потому что threading.Lock везде один и тот же и нет смысла его копировать, я так думаю.
У тебя ведь id это число? В таком случае база тут охуеть как не подходит к задаче. Задачу можно решить гораздо проще и эффективнее, оперируя отдельными битами. Номер бита в файле = порядковый номер id. Еще можно использовать хранилище ключ->значение, berkeley db например, оно тут более подходит чем sql, да и гораздо шустрее.
Вот это вообще пушка! Спасибо за ценный совет. Реализовал это при помощи shelve — посмотрим, как такой вариант будет реагировать на растущий объем.
К сожалению, несмотря на всё удобство и простоту использования, shelve оказался намного менее приспособлен к работе с заметными объемами, чем sqlite-база. Скорость работы с увеличением размера файла снижается буквально на глазах.
Попробуй вариант с выставлением бита соотв порядковому номеру id. Например для вконтакта с его 150млн юзеров размер файла будет 20мб. Скорость будет оставаться постоянной в независимости от объема данных. Алгоритм прост: 1. offset = id / 8 получаем смещение. 2. id - (offset * 8) получаем номер бита в байте. 3. Дальше seek по смещению. 4. Немного битоёбства. 5. PROFIT! А избегая думать и втыкая всякие базы ты само собой будешь получать в итоге хуиту, таковы законы этой вселенной.