Вход в EventBrite с помощью Scrapy - PullRequest
       33

Вход в EventBrite с помощью Scrapy

0 голосов
/ 01 октября 2019

Я хочу узнать больше о том, как Scrapy можно использовать для входа на веб-сайты. Я просмотрел некоторые документы и руководства и в итоге получил Использование FormRequest.from_response () для имитации входа пользователя в систему . Используя инструменты разработчика Chrome, я просматриваю ответ «login» после входа со страницы https://eventbrite.ca/signin/login.

Некоторые вещи, на которые стоит обратить внимание, это то, что при попытке войти в браузер, в Интернетестраница направит вас на https://eventbrite.ca/signin,, где вы введете адрес электронной почты и отправите форму.

Это отправляет запрос POST на https://www.eventbrite.ca/api/v3/users/lookup/ только с указанным адресом электронной почты, и если все будет в порядке, веб-страница будет использовать JS, чтобы "перенаправить" вас на https://eventbrite.ca/signin/login и сгенерироватьэлемент ввода "пароль".

После того, как вы введете свой пароль и нажмете кнопку формы, в случае успеха он перенаправит + сгенерирует ответ на вход в систему в результате POST, отправленного на https://www.eventbrite.ca/ajax/login/ с электронной почтой, pw и некоторыми другимиинформация (которую можно найти в моем фрагменте кода).

Сначала я попытался сделать это шаг за шагом: переходя из .ca / signup, отправляя POST с моим письмом в конечную точку поиска, но я получаю ошибку 401. Затем я попытался напрямую зайти в .ca / signup / login и отправить всю информацию, найденную в ответе на вход в систему, но получить 403.

Я уверен, что что-то упустил, хотя кажется, что я POSTingна правильные URL-адреса и найти правильную форму, но не могу понять, что осталось. Также, попробовав некоторое время, задаюсь вопросом, будет ли Selenium лучшей альтернативой для входа в систему и некоторой автоматизации на веб-странице, на которой загружено JS. Любая помощь приветствуется.

def login(self, response):
    yield FormRequest.from_response(
        response,
        formxpath="//form[(@novalidate)]",
        url='https://www.eventbrite.ca/ajax/login/',
        formdata={
            'email': 'email@email.com',
            'password': 'password',
            'forward':'',
            'referrer': '/',
            'pckg': '',
            'stld': ''
        }, 
        callback=self.begin_event_parse
    )

.ca / попытка регистрации / входа (403):

 [scrapy.core.engine] DEBUG: Crawled (403) <POST https://www.eventbrite.ca/ajax/login/> (referer: https://www.eventbrite.ca/signin/login)

.ca / попытка регистрации (401):

[scrapy.core.engine] DEBUG: Crawled (401) <POST https://www.eventbrite.ca/api/v3/users/lookup/> (referer: https://www.eventbrite.ca/signin/login)

1 Ответ

0 голосов
/ 03 октября 2019

Похоже, вам не хватает X-CSRFToken в ваших заголовках. Этот токен используется для защиты ресурса от подделки межсайтовых запросов.

В этом случае он предоставляется в файлах cookie, и его необходимо сохранить и передать.

Aпростая реализация, которая работает для меня:

import re
import scrapy

class DarazspidySpider(scrapy.Spider):
    name = 'darazspidy'

    def start_requests(self):
        yield scrapy.Request('https://www.eventbrite.ca/signin/?referrer=%2F%3Finternal_ref%3Dlogin%26internal_ref%3Dlogin%26internal_ref%3Dlogin', callback=self.lookup)

    def lookup(self, response):
        yield scrapy.FormRequest(
            'https://www.eventbrite.ca/api/v3/users/lookup/',
            formdata={"email":"email@mail-v.net"},
            headers={'X-CSRFToken': self._get_xcsrf_token(response),},
            callback=self.login,
        )

    def _get_xcsrf_token(self, response):
        cookies = response.headers.getlist('Set-Cookie')
        cookie, = [c for c in cookies if 'csrftoken' in str(c)]
        self.token = re.search(r'csrftoken=(\w+)', str(cookie)).groups()[0]
        return self.token

    def login(self, response):
        yield scrapy.FormRequest(
            url='https://www.eventbrite.ca/ajax/login/',
            formdata={
                'email': 'email@mail-v.net',
                'password': 'pwd',
                'forward':'',
                'referrer': '/?internal_ref=login&internal_ref=login',
                'pckg': '',
                'stld': ''
            },             
            callback=self.parse,
            headers={'X-CSRFToken': self.token}
        )

    def parse(self, response):
        self.logger.info('Logged in!')

В идеале, вы хотите создать промежуточное программное обеспечение, чтобы сделать это для вас.

Как правило, когда вы сталкиваетесь с таким поведением, вы хотитечтобы попытаться воспроизвести то, что посылает браузер, как можно ближе, посмотрите внимательно на заголовки и попытайтесь их воспроизвести.

...