[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. Izengardjke

    Izengardjke New Member

    Joined:
    1 Jun 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Вопрос закрыт, надо лишь добавить цикл while
     
  2. yarbabin_old

    yarbabin_old Banned

    Joined:
    15 Aug 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    подскажите, как осуществить
    нужно спарсить страницу так, чтобы она загрузилась с моими параметрами в исходном коде
    например:
    исходная стараница идет с
    Code:
    <INPUT type="hidden" name="nomer" value="123456">
    а мне нужно чтобы было
    Code:
    <INPUT type="hidden" name="nomer" value="654321">
    и после этого, я еще должен передать остальные параметры, вместе с этим
     
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    yarbabin вы делаете что-то не то. Вам это не нужно.
     
    _________________________
  4. avonar

    avonar Member

    Joined:
    19 May 2008
    Messages:
    20
    Likes Received:
    15
    Reputations:
    15
    Code:
    import re
    link_text = re.sub(ur'<INPUT type="hidden" name="nomer" value="(.+?)">', '<INPUT type="hidden" name="nomer" value="654321">', link_text)
    слегка по быдлокодерски, но регулярки у меня всегда так получаются :D
     
    1 person likes this.
  5. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    916
    Reputations:
    363
    заметил такую особенность
    пишу логин для сайта
    если захожу с браузера и логинюсь им же, то скрипт нормально заходит, пишет что акк зашел
    а если не зайти до этого, с браузера, то скрипт не заходит
    мой браузер и юзер-агент совпадают
    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'
    
    из-за чего это, и как быть
     
    _________________________
    #865 yarbabin, 27 Aug 2011
    Last edited: 27 Aug 2011
  6. tch

    tch New Member

    Joined:
    11 Jun 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Проблема, есть парсер по урлам (урлы берем) из файла и вот если воспользоваться им в запросе просто выбрасывает ерорры, если содать переменную то все ок.


    єто то что парсит
    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]
     
    #866 tch, 2 Sep 2011
    Last edited: 2 Sep 2011
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    tch каждую строчку взятую из файла надо очистить от символов переноса строки методом strip()
     
    _________________________
  8. tch

    tch New Member

    Joined:
    11 Jun 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    переписал скрипт под 2.7 питон, но как вот избавиться от urllib который подвис потому что страничка непомерно большая?!
     
    1 person likes this.
  9. avonar

    avonar Member

    Joined:
    19 May 2008
    Messages:
    20
    Likes Received:
    15
    Reputations:
    15
    а как ты пришел к этому выводу?
    вообще можно попробывать urllib2 или grab(curl) или scrapy(про не ехз на самом деле, просто очередной интерфейс для парсинга с плюшками своими)
     
  10. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Изменение строки в текстовом файле

    Добрый день.

    Есть файл 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. Может есть другие варианты замены отдельной строки в файле?
     
  11. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Вы ведь понимаете, что строки в файлах - это абстракция? Если вам нужно заменить "two\n" на "updated\n", то все остальное содержимое тоже нужно будет сдвинуть на 4 символа. Попробуйте представить "one\ntwo\nthree\nfour\n", если так будет проще.
    гуглится это:
     
  12. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Спасибо за ответ.
    Значит, получается, что остается единственный вариант — считывать файл в список, менять его и записывать в файл целиком обратно?
     
    1 person likes this.
  13. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    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() и использовать его свой в каждом потоке?
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    cactuar И правда работает? Питон не позволяет обращаться к одному экземпляру подключения к базе/курсору sqlite из разных потоков.

    Создайте индекс на столбец по которому ищете, иначе каждый раз происходит полный поиск по всей таблице.

    Насчет P.S. - уникальный объект threading.Lock для каждого потока - не имеет смысла, подумайте сами почему.
     
    _________________________
  15. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Gifts, крайне благодарю за ответ.
    Да, правда работает :)
    Если при создании connection указать параметр check_same_thread = False, то python милостиво сжалится и разрешит обращаться к базе с разных потоков.

    Спасибо за дельный совет. Я правда пока не понял, что это значит, но спасибо за направление.

    Наверное потому что threading.Lock везде один и тот же и нет смысла его копировать, я так думаю.
     
    #875 cactuar, 22 Oct 2011
    Last edited: 22 Oct 2011
  16. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    У тебя ведь id это число? В таком случае база тут охуеть как не подходит к задаче. Задачу можно решить гораздо проще и эффективнее, оперируя отдельными битами.
    Номер бита в файле = порядковый номер id.

    Еще можно использовать хранилище ключ->значение, berkeley db например, оно тут более подходит чем sql, да и гораздо шустрее.
     
  17. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Вот это вообще пушка! Спасибо за ценный совет.
    Реализовал это при помощи shelve — посмотрим, как такой вариант будет реагировать на растущий объем.
     
  18. cactuar

    cactuar New Member

    Joined:
    13 Jun 2010
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    К сожалению, несмотря на всё удобство и простоту использования, shelve оказался намного менее приспособлен к работе с заметными объемами, чем sqlite-база. Скорость работы с увеличением размера файла снижается буквально на глазах.
     
  19. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    cactuar покажите минимально рабочий код, на котором у вас возникает проблема скорости.
     
    _________________________
  20. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Попробуй вариант с выставлением бита соотв порядковому номеру id. Например для вконтакта с его 150млн юзеров размер файла будет 20мб. Скорость будет оставаться постоянной в независимости от объема данных.
    Алгоритм прост:
    1. offset = id / 8 получаем смещение.
    2. id - (offset * 8) получаем номер бита в байте.
    3. Дальше seek по смещению.
    4. Немного битоёбства.
    5. PROFIT!

    А избегая думать и втыкая всякие базы ты само собой будешь получать в итоге хуиту, таковы законы этой вселенной.