Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2015 16:44:41

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

Коллеги, не могу победить проблему логина на сайте.

from grab import Grab
import logging
logger = logging.getLogger('grab')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
g = Grab()
g.go('http://www.baby.ru/')
g.set_input('login', 'laro@flurred.com')
g.set_input('password', 'testPy')
g.submit()

Получаю ошибку:
“No input element with the name ‘login’”

Помогите. Спасибо, что уделили моему вопросу своё время.

Офлайн

#2 Июль 28, 2015 22:27:06

artexnet
Зарегистрирован: 2015-06-22
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

А каким образом вы пытаетесь ее (проблему) решить?

Пробуем:
1. Chrome -> http://baby.ru -> View Source -> Ctrl+F -> name=“login” - ничего не найдено.
Логично, что Grab выдает ошибку, так как такого элемента там нету.

Идем дальше, ведь кнопка “Вход” на сайте все таки имеется…
2. Chrome -> Menu -> More Tools -> Developer Tools -> Network. Нажимаем на “Вход”, набираем любые значения, нажимаем “Войти”, смотрим на вкладку “Network”, замечаем “login/”, нажимаем, в инфо Headers -> Request URL…

Стоп!
3. Оказывается авторизация происходит при помощи API - http://www.baby.ru/api/login/ (Form Data - login:<email>; password:<pass>)

Получается что нужно:
- отправить POST запрос
- получить cookie авторизации
- использовать этот самый cookie в последующих запросах

В итоге получаем следующее:

import requests
from grab import Grab
payload = {
    'login': 'laro@flurred.com',
    'password': 'testPy',
}
r = requests.post('http://www.baby.ru/api/login', data=payload)
session = r.headers.get('set-cookie')
session_id = session.split(';')[0].split('=')[1]
g = Grab()
g.cookies.set(name='PHPSESSID', value=session_id, domain='baby.ru', path='/')
response = g.go('http://www.baby.ru/')
print session_id
print response.body

Офлайн

#3 Июль 29, 2015 09:16:18

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

Спасибо за помощь. Пробовал пост передать, не выходило. Так же спасибо за детальный рассказ про возможности хрома.
Но вот не зашёл он.

g.config['cookies'] = {'name':'PHPSESSID', 'value':session_id, 'domain':'baby.ru', 'path':'/'}

Если сделать
 r.text
получим
u'{"http":403,"status":0,"data":"bad_request"}'

Буду копать.

Отредактировано paraman (Июль 29, 2015 10:04:25)

Офлайн

#4 Июль 29, 2015 10:26:20

artexnet
Зарегистрирован: 2015-06-22
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

Пожалуйста, только это был не рассказ про возможности хрома а совет как победить подобную проблему следующий раз… Вы же написали код который не мог работать по определению, так как не изучили как работает сайт который хотите распарсить.

Кстати вчера все работало, а сегодня ваш аккаунт заблокирован по неизвестной причине. В любом случае удачи!

Офлайн

#5 Июль 29, 2015 10:41:15

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

artexnet
Пожалуйста, только это был не рассказ про возможности хрома а совет как победить подобную проблему следующий раз… Вы же написали код который не мог работать по определению, так как не изучили как работает сайт который хотите распарсить.Кстати вчера все работало, а сегодня ваш аккаунт заблокирован по неизвестной причине. В любом случае удачи!

Я подумал что работает и удалил тестовую учётную запись.
Но код не работает.

Вот Ваш код с новым логином и паролем:

import requests
from grab import Grab
payload = {
    'login': 'testpyt@valemail.net',
    'password': 'testpyttestpyt',
}
r = requests.post('http://www.baby.ru/api/login', data=payload)
session = r.headers.get('set-cookie')
session_id = session.split(';')[0].split('=')[1]
g = Grab()
g.cookies.set(name='PHPSESSID', value=session_id, domain='baby.ru', path='/')
response = g.go('http://www.baby.ru/')
print session_id
print response.body

обращаю ваше внимание на
AttributeError: 'Grab' object has no attribute 'cookies'
И соответственно, если посмотреть r.text получим
'{"http":403,"status":0,"data":"bad_request"}'
, что говорит нам о том, что залогиниться мы так и не смогли.

Офлайн

#6 Июль 29, 2015 11:15:48

artexnet
Зарегистрирован: 2015-06-22
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

обновите Grab до последней версии: pip install Grab –upgrade

Login не проходит, вероятно нужно с request Headers поиграться..

Офлайн

#7 Июль 29, 2015 11:32:27

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

artexnet
request
Обновился. Но что-то нет результата.

Офлайн

#8 Июль 29, 2015 11:40:09

artexnet
Зарегистрирован: 2015-06-22
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.

Офлайн

#9 Июль 29, 2015 11:42:45

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

artexnet
AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.
Я имел ввиду, про результат захода на сайт

Офлайн

#10 Июль 29, 2015 12:18:12

artexnet
Зарегистрирован: 2015-06-22
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите с Grab и формой заполнения

.....
headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,hy;q=0.2',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.baby.ru',
    'Origin': 'http://www.baby.ru',
    'Pragma': 'no-cache',
    'Referer': 'http://www.baby.ru/',
    'X-METHOD': 'post',
    'X-Requested-With': 'XMLHttpRequest',
}
r = requests.post('http://www.baby.ru/api/login', data=payload, headers=headers)
session_id = r.cookies['PHPSESSID']

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version