Найти - Пользователи
Полная версия: Помогите с Grab и формой заполнения
Начало » Python для новичков » Помогите с Grab и формой заполнения
1 2
paraman
Коллеги, не могу победить проблему логина на сайте.
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’”

Помогите. Спасибо, что уделили моему вопросу своё время.
artexnet
А каким образом вы пытаетесь ее (проблему) решить?

Пробуем:
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
paraman
Спасибо за помощь. Пробовал пост передать, не выходило. Так же спасибо за детальный рассказ про возможности хрома.
Но вот не зашёл он.
g.config['cookies'] = {'name':'PHPSESSID', 'value':session_id, 'domain':'baby.ru', 'path':'/'}

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

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

Кстати вчера все работало, а сегодня ваш аккаунт заблокирован по неизвестной причине. В любом случае удачи!
paraman
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"}'
, что говорит нам о том, что залогиниться мы так и не смогли.
artexnet
обновите Grab до последней версии: pip install Grab –upgrade

Login не проходит, вероятно нужно с request Headers поиграться..
paraman
artexnet
request
Обновился. Но что-то нет результата.
artexnet
AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.
paraman
artexnet
AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.
Я имел ввиду, про результат захода на сайт
artexnet
.....
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']
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB