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')
Gifts, отображаются кракозябры. Да и раньше пробовал добавлять encode - не помогало. Есть еще варианты?
just_seo если вы в винде, то перенаправляйте вывод в файл, так как стандартная командная строка работает в кодировке CP866
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?
Парни всем привет! Никогда не писал на питоне, но писал на других языках. Возникла задача сколотить скрипт для вынымания данных с сайта. Там авторизация , поковыряв по интернетам я так понял что мне нужен urllib. кто может показать пример как это должно работать ?
форма перефразирую. Есть сайт, на котором введена аутентификация, я вполне легитимный пользователь, но мне надо автоматически с него данные забрать. Что происходит при входе на сайт я получаю сообщение(301) о том что он перемещён. Затем браузер переходит на новую страницу, там поле ввода логина и пароля + капча. Мне необходимо ввести учетные данные и получить пароль. Как я понимаю аглоритм должен быть примерно следующий: 1. Сразу топаем на новую страницу чтобы не замарачиваться. Вот тут вопрос, исполняется некий cgi.exe который примает параметр сначала сgi.exe?function=is_newlog , а затем на странице он выполняется сgi.exe?function=show_test. В случае верного ввода капчи я получаю cookie. ВОт тут и мои вопросы. Достаточно ли urllib2(если не включать капчу) ? данные передаваемые мною на сервер и в ответ я смотрю в tamperdata , достаточно ли их или мне может понадобиться что то ещё? Где можно посмотреть примеры подобных действ?
SterhTG интересно, за сколько перефразирований все сведется к фразе - "напишите за меня, а?" А по сути - куки вы получаете еще до того как разгадаете капчу. urllib2 вам хватит. TamperData в общем-то тоже достаточно. Примеры можно спросить у гугла, на запросы типа: "python пишем регер"
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()]
SterhTG с какой целью вы парсите форму? Вам нужно повторить пост запрос, который вы "подсмотрели" с помощью tamperdata. Плюс вам требуется записывать куки, как это делается для urllib2 - смотреть тут: http://docs.python.org/library/cookielib.html#examples
Мне необходимо вынуть капчу со страницы и затем передать её в форму . Капча это особый вопрос, но он решаем.
Мне необходимо вынуть капчу со страницы и затем передать её в форму . Капча это особый вопрос, но он решаем. Обрабатывать тэг решил так cform = re.compile('<form(.*?)</form>', re.DOTALL)
SterhTG в соседней теме по регулярным выражениям - показываете пример входного текста, и что вам нужно получить - за вас напишут регулярку
Так не интересно . В общем имею следущий код, который делает следующее, вынимает картинку капчи, вынимает форму, и сохраняет капчу. Опытные люди догадаются, что надо дописть и что получим. Но в данной системе есть уязвимость, которая делает капчу не опасной. Думаю кому пригодиться мой опыт, код ниже 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() и там ловить печенюшку ? Также как мне удостовериться что там что то есть? В классе кукижар нет проверки содержания, как мне определить содержиться там что то или нет?
SterhTG содержимое cookieJar хранится в аттрибуте _cookies или можно проитерировать все элементы: Code: cookie = cookielib.cookiejar() // что то тут с ним делают, а дальше: for row in cookie: print row // или print cookie._cookies Да и вообще, cookielib прекрасно работает, очень редок случай, когда надо что-то допилить с помощью policy Теперь по коду - так на питоне лучше не писать. Создайте собственный опенер, работающий с куками, пропишите все заголовки в него. Реферера устанавливайте в Request Магические переменные - плохо (я имею ввиду такое: capcha_link.group()[10:-2]) Лучше научитесь пользоваться регулярками
Подскажите , что значит " Теперь по коду - так на питоне лучше не писать." ? По каким причинам так не пишут на питоне? Правельно ли я понял, что мне надо создать класс опенер с заранее определёнными хедарами? Магические переменные заменил на регулярку. "Реферера устанавливайте в 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 должно бы вывалться хотябы) их тоже нет ... Подскажите что можно сделать???
Я с python сталкиваюсь первый раз, до этого дела не имел, нужен скрипт speedtest'a, как можно реализовать?
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 если просто - то попытаться скачать какой нибудь достаточно большой файл с удаленного сервера. Причем желательно чтобы сервер был мало нагружен и имел больший канал, чем ваш
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 - $timeStart, 1); 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>"; } } ?>
NeW а что, по вашему, делает представленный вами код? А, понятно, вы как раз это спросили в соседнем топике. Если все же не понятно - создается длинная строка и передается пользователю. Естественно - размер передаваемых данных деленный на время передачи - и будет скорость.