Форум сайта python.su
1
Коллеги, не могу победить проблему логина на сайте.
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()
Офлайн
1
А каким образом вы пытаетесь ее (проблему) решить?
Пробуем:
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
Офлайн
1
Спасибо за помощь. Пробовал пост передать, не выходило. Так же спасибо за детальный рассказ про возможности хрома.
Но вот не зашёл он.
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)
Офлайн
1
Пожалуйста, только это был не рассказ про возможности хрома а совет как победить подобную проблему следующий раз… Вы же написали код который не мог работать по определению, так как не изучили как работает сайт который хотите распарсить.
Кстати вчера все работало, а сегодня ваш аккаунт заблокирован по неизвестной причине. В любом случае удачи!
Офлайн
1
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'
'{"http":403,"status":0,"data":"bad_request"}'Офлайн
1
обновите Grab до последней версии: pip install Grab –upgrade
Login не проходит, вероятно нужно с request Headers поиграться..
Офлайн
1
artexnetОбновился. Но что-то нет результата.
request
Офлайн
1
AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.
Офлайн
1
artexnetЯ имел ввиду, про результат захода на сайт
AttributeError: ‘Grab’ object has no attribute ‘cookies’ ошибка исчезает.
Офлайн
1
..... 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']
Офлайн