Уведомления

Группа в Telegram: @pythonsu

#1 Май 21, 2008 18:52:42

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

Пытаюсь открыть страничку сайта, передав ей заранее полученные cookie (автоматически “залогиниться” на сайте). Не подумайте плохого - это не спам-робот :), просто хочу автоматически прочитать новости, воспользовавшись своими существующими учётными данными.
Сайт - http://www.nnm.ru

# -*- coding: utf-8 -*-
import codecs, sys, os
from BeautifulSoup import BeautifulSoup
import urllib, urllib2
import binascii
import datetime, re
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
# логин, получение cookie
params = urllib.urlencode({'login' : 'Vasya',
                           'passwd' : 'Pass'})
# создаём объект запроса
req = urllib2.Request('http://www.nnm.ru', params)
# получаем файловый объект странички
f = urllib2.urlopen(req)
# получаем http-заголовок с cookies
cookie = unicode(f.headers['Set-Cookie'], 'cp1251')
print cookie
# получаем значение cookie (id сессии)
matches = re.findall('PHPSESSID=(.*?); ', cookie)
cookie = matches[0]
print cookie
req = urllib2.Request('http://www.nnm.ru')
req.add_header("Cookie", "PHPSESSID=" + cookie + ";")
f = urllib2.urlopen(req)
print f.read().decode('cp1251')
Приведённый код пригоден для запуска.
Вобщем, проблема в том, что залогиниться я не могу. Последний “print” выдаёт страничку, по которой видно, что я не залогинен.

Я формирую в скрипте словарь “params”, в котором находятся данные Web-формы, которую мне нужно “заполнить”. Посмотрев в html-код страницы http://www.nnm.ru, в форме для логина я нашёл всего два поля ('login' и ‘passwd’), их и передаю. Куки я получаю, но видимо, какие-то не те (PHPSESSID - видимо - совсем не то, что мне нужно). Что-то я упустил - не пойму, что.

Если на этом форуме есть счастливые пользователи http://www.nnm.ru, прошу помощи - попробуйте воспользоваться своими учётными данными, чтобы протестить скрипт. Или, может, кто и так что-то подскажет, без тестирования…



Офлайн

#2 Май 21, 2008 20:27:15

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

Я так глубоко работу с куки не знаю, поэтому пользуюсь стандартным модулем cookielib ;)

import cookielib, urllib2, urllib

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

request0 = urllib2.Request('http://nnm.ru', None, {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle0 = opener.open(request0, urllib.urlencode({'login' : '***','passwd' : '***'}))
data = handle0.read()
handle0.close()

file('tst.htm', 'w').write(data)
должно работать



Отредактировано (Май 21, 2008 20:33:24)

Офлайн

#3 Май 21, 2008 20:32:06

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

а еще - если я не ошибаюсь, вроде там rss отдают (по крайней мере доки точно отдают).



Офлайн

#4 Май 22, 2008 09:41:21

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

shiza
Спасибо, но не понял до конца, как этим правильно пользоваться. Заглавную страничку сайта я твоим способом открыл вроде без проблем, но вот дальше - непонятно. Например:

# -*- coding: utf-8 -*-
import codecs, sys, os
from BeautifulSoup import BeautifulSoup
import urllib, urllib2, cookielib
import binascii
import datetime, re
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
request0 = urllib2.Request('http://luxter.nnm.ru/zenit_chempion_', None,
    {"User-Agent":
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle0 = opener.open(request0, urllib.urlencode({'login' : '***','passwd' : '***'}))
data = handle0.read()
handle0.close()
print data.decode('cp1251')
Я пытаюсь открыть URL http://luxter.nnm.ru/zenit_chempion_. Если подставить в приведённый скрипт реальные учетные данные вместо “***”, открывается совсем не тот URL.

Не пойму, в чём дело. На заглавной странице сайта Web-форма для залогинивания имеет action=“/”, а на этой странице - action=“/zenit_chempion_”. Может, в этом дело? Только как это учесть в скрипте?



Офлайн

#5 Май 22, 2008 09:50:34

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

shiza
а еще - если я не ошибаюсь, вроде там rss отдают (по крайней мере доки точно отдают).
В том-то и дело, что отдают конкретные доки. А я пытаюсь разобрать URL наподобие такого:
http://www.nnm.ru/15.05.2008/~allnews
Пройти по всем ссылкам (открыть каждую новость) и конвертнуть всё это добро в формат FB2 (фикшн-бук), чтобы можно было читать новости на мобильных устройствах, предварительно их “качнув” моим скриптом.



Офлайн

#6 Май 22, 2008 11:20:55

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

После залогинивания - срабатывает редирект на http://nnm.ru/index.html (т.е. на главную).

Поэтому надо считывать инфу в два запроса: в первом запросе мы логинимся и получаем куки, во втором запросе мы с этой кукой считываем нужную странчику.

import cookielib, urllib2, urllib

cj = cookielib.CookieJar() #создаем куки обработчик и кукихранилище в одном лице
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #делаем опенер с поддержкой куки

#первый запрос - логинимся и получаем куки
request0 = urllib2.Request('http://nnm.ru', None, {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle0 = opener.open(request0, urllib.urlencode({'login' : '***','passwd' : '***'}))
data0 = handle0.read()
handle0.close()

#второй запрос - получаем нужную инфу
request1 = urllib2.Request('http://luxter.nnm.ru/zenit_chempion_', None, {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8"})
handle1 = opener.open(request1)
data1 = handle1.read()

file('tst.htm', 'w').write(data1)



Отредактировано (Май 22, 2008 11:31:58)

Офлайн

#7 Май 22, 2008 12:50:52

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

urllib2: Заполнение Web-форм

Спасибо, заработало!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version