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

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

  1. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    just_seo
    Code:
    import lxml.html
    import urllib
    
    page = urllib.urlopen('http://search.yaca.yandex.ru/yca/cy/ch/just-seo.ru/')
    doc = lxml.html.document_fromstring(page.read())
    tic = doc.xpath('/html/body/table[@class="content"]/tr/td[@class="body left"]/p[@class="errmsg"]/b/text()')
    
    print tic[0].encode('cp1251')
     
    _________________________
  2. just_seo

    just_seo New Member

    Joined:
    28 Feb 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    -1
    Gifts, отображаются кракозябры.

    Да и раньше пробовал добавлять encode - не помогало. Есть еще варианты?
     
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    just_seo если вы в винде, то перенаправляйте вывод в файл, так как стандартная командная строка работает в кодировке CP866
     
    _________________________
  4. just_seo

    just_seo New Member

    Joined:
    28 Feb 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    -1
    Gifts, спасибо большое за ответ.

    Есть еще один вопрос по поводу компонентов для работы с твиттером. В общем, хочу написать бота для твиттера, как в этой статье.

    oauth-python-twitter2 вытянул через svn. Файл oauthtwitter.py сделал видимым в PYTHONPATH (sys.path.append('c:\python26\lib\oauth-python-twitter2\oauthtwitter.py')). Правильно?
    Дальше скачал архив с python-oauth2. Но вот тут не могу разобраться, что за чем делать. Сперва я распаковал архив в папку Lib, дальше пробовал устанавливать (c:\sjsj\ss\s\setup.py install). В конце инсталяции появляется "Finished processing dependencies for oauth2==unknown".
    Дальше не знаю, что мне делать. Что я сделал неправильно? И как установить этот oauth2?
     
  5. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Парни всем привет! Никогда не писал на питоне, но писал на других языках. Возникла задача сколотить скрипт для вынымания данных с сайта. Там авторизация :( , поковыряв по интернетам я так понял что мне нужен urllib.
    кто может показать пример как это должно работать ?
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG http://docs.python.org/library/urllib2.html#examples
     
    _________________________
  7. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    форма

    перефразирую. Есть сайт, на котором введена аутентификация, я вполне легитимный пользователь, но мне надо автоматически с него данные забрать.
    Что происходит при входе на сайт я получаю сообщение(301) о том что он перемещён. Затем браузер переходит на новую страницу, там поле ввода логина и пароля + капча. Мне необходимо ввести учетные данные и получить пароль.
    Как я понимаю аглоритм должен быть примерно следующий:
    1. Сразу топаем на новую страницу чтобы не замарачиваться. Вот тут вопрос, исполняется некий cgi.exe который примает параметр сначала сgi.exe?function=is_newlog , а затем на странице он выполняется сgi.exe?function=show_test. В случае верного ввода капчи я получаю cookie.
    ВОт тут и мои вопросы. Достаточно ли urllib2(если не включать капчу) ? данные передаваемые мною на сервер и в ответ я смотрю в tamperdata , достаточно ли их или мне может понадобиться что то ещё?
    Где можно посмотреть примеры подобных действ?
     
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG интересно, за сколько перефразирований все сведется к фразе - "напишите за меня, а?"

    А по сути - куки вы получаете еще до того как разгадаете капчу. urllib2 вам хватит. TamperData в общем-то тоже достаточно. Примеры можно спросить у гугла, на запросы типа: "python пишем регер"
     
    _________________________
  9. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Gifts ровно на 0. за меня ничего писать не надо. мне надо знать, что инструменты и направление верное. было пару раз в моей практике , что останавливаешся в паре метров от цели и начинаешь все заново. вот и хочу узнать у тех кто писал подобное.
    В логах tamperdata я не вижу присвоения куки, но логично предположить что сервер меня както идентифицирует.
    Вопрос по urllib2, когда я прочетал данные с веб сервера, сохранил их в переменную, как затем найти там что мне нужно?
    те .
    Code:
    import urllib2  
    req = urllib2.Request(url='http://www.mail.ru') req.add_header("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/20081201/3.0.5")
    webdt = urllib2.urlopen(req) 
    data = webdt.read() 
    
    
    В дата храниться гдето форма как её вынуть? а потом вынуть оттуда данные формы?
    На данный момент разбираю это regexp, но что то подсказывает что это не так делается обычно. приче делаю так
    Code:
    form = re.search( "<form", txtdt) 
    forme = re.search( "</form>" , txtdt) 
    fillf= txtdt[ form.start():forme.start()]
     
    #809 SterhTG, 16 Mar 2011
    Last edited: 16 Mar 2011
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG с какой целью вы парсите форму? Вам нужно повторить пост запрос, который вы "подсмотрели" с помощью tamperdata.

    Плюс вам требуется записывать куки, как это делается для urllib2 - смотреть тут: http://docs.python.org/library/cookielib.html#examples
     
    _________________________
  11. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Мне необходимо вынуть капчу со страницы и затем передать её в форму :). Капча это особый вопрос, но он решаем.
     
  12. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Мне необходимо вынуть капчу со страницы и затем передать её в форму :). Капча это особый вопрос, но он решаем.
    Обрабатывать тэг решил так
    cform = re.compile('<form(.*?)</form>', re.DOTALL)
     
  13. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG в соседней теме по регулярным выражениям - показываете пример входного текста, и что вам нужно получить - за вас напишут регулярку
     
    _________________________
  14. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Так не интересно :). В общем имею следущий код, который делает следующее, вынимает картинку капчи, вынимает форму, и сохраняет капчу. Опытные люди догадаются, что надо дописть и что получим. Но в данной системе есть уязвимость, которая делает капчу не опасной.
    Думаю кому пригодиться мой опыт, код ниже
    Code:
    
    import urllib2,re
    
    rex_form = re.compile('<FORM(.*?)</FORM>', re.DOTALL | re.I )
    rex_capcha = re.compile('<img src="(.*?)>',  re.DOTALL | re.I)
    req = urllib2.Request(url='https://mycheck.kz/exec.exe', data='function=new_log')
    req.add_header("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/20081201/3.0.5")
    req.add_header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    req.add_header("Accept-Language","ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3")
    req.add_header("Accept-Encoding","gzip,deflate")
    req.add_header("Accept-Charset","windows-1251,utf-8;q=0.7,*;q=0.7")
    req.add_header("Connection","keep-alive")
    req.add_header("Keep-Alive","115")
    webdt = urllib2.urlopen(req)
    txtdt = webdt.read()
    webdt.close()
    txt_form = rex_form.search(txtdt)
    capcha_link = rex_capcha.search(txt_form.group())
    img_link = 'https://mycheck.kz/cgi-bin/'+capcha_link.group()[10:-2]
    imgname = 'nc_'+capcha_link.group()[-4:-2] + '.jpeg' 
    req_img = urllib2.Request(img_link)
    req_img.add_header("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/20081201/3.0.5")
    req_img.add_header("Accept","image/png,image/*;q=0.8,*/*;q=0.5")
    req_img.add_header("Accept-Language","ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3")
    req_img.add_header("Accept-Encoding","gzip,deflate")
    req_img.add_header("Accept-Charset","windows-1251,utf-8;q=0.7,*;q=0.7")
    req_img.add_header("Connection","keep-alive")
    req_img.add_header("Keep-Alive","115")
    req_img.add_header("Referer","https://mycheck.kz/exec.exe?function=new_log")
    req_img.add_header("Cookie","Lang=0")
    
    fout = open (imgname,"wb")
    fout.write(fimg.read())
    fout.close()
    
    


    Когда я произвожу пост данных в ffx я вижу печеньку. Правельно ли я понял что перед выполнением запроса на форму мне надо ловить её? те в самом начале когда я прошу форму надо сразу устанавливать CookieJar() и там ловить печенюшку ? Также как мне удостовериться что там что то есть? В классе кукижар нет проверки содержания, как мне определить содержиться там что то или нет?
     
    #814 SterhTG, 17 Mar 2011
    Last edited: 17 Mar 2011
  15. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG содержимое cookieJar хранится в аттрибуте _cookies или можно проитерировать все элементы:

    Code:
    cookie = cookielib.cookiejar()
    // что то тут с ним делают, а дальше:
    for row in cookie:
        print row
    // или
    print cookie._cookies
    
    Да и вообще, cookielib прекрасно работает, очень редок случай, когда надо что-то допилить с помощью policy

    Теперь по коду - так на питоне лучше не писать. Создайте собственный опенер, работающий с куками, пропишите все заголовки в него. Реферера устанавливайте в Request

    Магические переменные - плохо (я имею ввиду такое: capcha_link.group()[10:-2]) Лучше научитесь пользоваться регулярками
     
    _________________________
  16. SterhTG

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

    Joined:
    14 Apr 2008
    Messages:
    87
    Likes Received:
    11
    Reputations:
    0
    Подскажите , что значит "
    Теперь по коду - так на питоне лучше не писать." ? По каким причинам так не пишут на питоне? Правельно ли я понял, что мне надо создать класс опенер с заранее определёнными хедарами?
    Магические переменные заменил на регулярку.
    "Реферера устанавливайте в Request" это насколько я понял можно сделать так
    urllib2.Request(url, data, headers) но тут вопрос, а если приписаны хедеры то они добавятся или будут только те что я установлю?
    Сейчас код перерос в такое

    Code:
    import cookielib,urllib,urllib2,re  
    rex_form = re.compile('<FORM(.*?)</FORM>', re.DOTALL | re.I ) 
    rex_captcha = re.compile('<img src="(.*?)>',  re.DOTALL | re.I) 
    rex_capnum = re.compile('\d{1,2}',  re.DOTALL | re.I)
    rex_capdata = re.compile('function=(.*?)\d{1,2}',  re.DOTALL | re.I) 
    rex_tblrec = re.compile('<input name="textTableRecordId"(.*?)>',  re.DOTALL | re.I) 
    rex_tblrecnum = re.compile('\d{1,4}',  re.DOTALL | re.I) 
    req_hdr = { "Host" : "ics.neogsm.kz", "User-Agent" :  "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/20081201/3.0.5)", "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",  "Accept-Language":"ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",  "Accept-Encoding":"gzip,deflate","Accept-Charset":"windows-1251,utf-8;q=0.7,*;q=0.7",  "Connection":"keep-alive","Keep-Alive":"115"} req_img_hdr = { "Host" : "ics.neogsm.kz", "User-Agent" :  "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.0.5) Gecko/20081201/3.0.5)", "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",  "Accept-Language":"ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3",  "Accept-Encoding":"gzip,deflate","Accept-Charset":"windows-1251,utf-8;q=0.7,*;q=0.7",  "Referer":"https://ics.neogsm.kz/ics/cgi-bin/cgi.exe?function=is_newlog", "Connection":"keep-alive","Keep-Alive":"115"} req_data = 'function=is_newlog' chknum = '123456789' numpwd = 'password' baseURL = 'https://mycheck.kz' loadURL = baseURL + '/exec.exe' 
    Request = urllib2.Request   
    work_jar = cookielib.CookieJar() 
    work_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(work_jar)) 
    work_opener.addheaders = zip(req_hdr.keys(), req_hdr.values()) 
    req = Request(url=loadURL, data=req_data) 
    webdt = work_opener.open(req) 
    txtdt = webdt.read() webdt.close()
    txt_form = rex_form.search(txtdt).group() 
    captcha_link = rex_captcha.search(txt_form).group()[10:-2] 
    captcha_data = rex_capdata.search(captcha_link).group()
     tblrec = rex_tblrec.search(txt_form).group() 
    tblrecnum = rex_tblrecnum.search(tblrec).group() 
    img_num = rex_capnum.search(captcha_link).group() 
    imgname = 'imgs/nc_'+ img_num + '.jpg'  
    req_img = Request(url=loadURL, data=captcha_data,req_img_hdr) 
    fimg = work_opener.open(req_img) 
    fout = open (imgname,"wb") 
    fout.write(fimg.read()) 
    fout.close() 
    print imgname 
    print tblrecnum 
    log_val = {'Lang' : '2',  'mobnum' : chknum,           'Password' : numpwd,  'antispamText' : '2011',           'textTableRecordId' : tblrecnum,  'x' : '24',  'y' : '8'}  
    data = urllib.urlencode(log_val)
    правельно ли я понял, что вызывая каждый раз опенер хедеры будут выставляться мои из опенера+ куки + те что я передам в реквест?
    также вопрос такой
    во многих примерах происходит прямая передача параметров
    Code:
     
    req = Request(url='http://www.mail.ru', 'func',{'Referrer': 'Test'})
    У меня сразу вываливается ошибка, почему ?
    Приходиться пользовать так:
    Code:
     
    req = Request(url='https://mycheck.kz', data=req_data,headers=req_img_hdr)
    logdt = work_opener.open(req_log)
    
    
    И вот фейл :(. Вроде как должно работать ан нет ... Теперь при попытке загрузить страничку получаю вечную тишину после work_opener.open(req_log). как я понял что то там не то... пытался посмотреть куки( по идее там Lang=0 должно бы вывалться хотябы) их тоже нет ... Подскажите что можно сделать???
     
    #816 SterhTG, 22 Mar 2011
    Last edited: 22 Mar 2011
  17. NeW

    NeW New Member

    Joined:
    9 Feb 2011
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Я с python сталкиваюсь первый раз, до этого дела не имел, нужен скрипт speedtest'a, как можно реализовать?
     
  18. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SterhTG
    правильно

    Внимательно читайте текст исключений, там скорее всего написано - нельзя передавать неименованые параметры после именованых, то есть должно быть так:
    Code:
    req = Request(url='http://www.mail.ru', data='func',headers={'Referrer': 'Test'})
    ## Или так:
    req = Request('http://www.mail.ru', 'func',{'Referrer': 'Test'})
    
    Переменная с реквестом и та, которую отправляете в опенер - разные
    Уберите из заголовков host, Connection и Keep-Alive. Первый - подставляет сам урллиб, и могут быть проблемы, второй и третий отвечают за то, что соединение не разрывается, из-за этого, скорее всего, и зависает получение страницы.

    Если что, метод close() у опенера - не делает ничего, можете не использовать

    Все же выделите методы из вашей простыни текста, код нечитаем



    NeW если просто - то попытаться скачать какой нибудь достаточно большой файл с удаленного сервера. Причем желательно чтобы сервер был мало нагружен и имел больший канал, чем ваш
     
    _________________________
    #818 Gifts, 25 Mar 2011
    Last edited: 25 Mar 2011
  19. NeW

    NeW New Member

    Joined:
    9 Feb 2011
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Gifts, ну кто будет специально качать файл? Нужно что то типа этого, только аналог на Python:
    PHP:
    <?php 
    echo "<p>Speed Test</p>";
    if(
    $_GET['do'] == ''

    echo 
    "<a href='?do=test&size=100'>Speed test with 100KB</a><br>";
     echo 
    "<a href='?do=test&size=512'>Speed test with 512KB</a><br>"
    echo 
    "<a href='?do=test&size=1024'>Speed test with 1024KB</a><br>"
    echo 
    "<a href='?do=test&size=5000'>Speed test with 5000KB</a><br>";
     }
     if(
    $_GET['do'] == 'test') { 
    $_size $_GET['size']; 
    if((
    $_size == '100') || ($_size == '512') || ($_size == '1024') || ($_size == '5000')) 
    {  
    $numKB $_size*1024
    function 
    getmicrotime() 
    {      
    list(
    $usec$sec) = explode(" "microtime());    
    return ((float)
    $usec + (float)$sec); 

     
    flush();
     
    $timeStart getmicrotime(); 
    $nlLength strlen("<br>"); 
    for (
    $i 0$i $numKB$i++) 
    {     
    $string =  str_pad(''1024 $nlLength'/*\\*') . "<br>";    
     
    flush();
     }
     
    $timeEnd getmicrotime(); 
    $timeDiff round($timeEnd $timeStart1);         
     echo 
    "<br>Transferred " $numKB/1024 " <abbr title=\"kilobyte\">KB</abbr> in 
    {$timeDiff} seconds. <a href='?do='>Test Again</a><br>";
     }
     else { 
    echo 
    "<b>Sorry, please pick a valid size.</b><a href='?do='>Go back</a><br>"


    ?> 
     
    #819 NeW, 25 Mar 2011
    Last edited: 26 Mar 2011
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    NeW а что, по вашему, делает представленный вами код?

    А, понятно, вы как раз это спросили в соседнем топике. Если все же не понятно - создается длинная строка и передается пользователю. Естественно - размер передаваемых данных деленный на время передачи - и будет скорость.
     
    _________________________
    #820 Gifts, 25 Mar 2011
    Last edited: 25 Mar 2011