Python 使用Scrapy登录EventBrite

Python 使用Scrapy登录EventBrite,python,authentication,scrapy,eventbrite,Python,Authentication,Scrapy,Eventbrite,我想了解更多关于如何使用Scrapy登录网站的信息。我看了一些文档和教程,最后在。使用Chrome开发工具,我在从页面登录后查看“登录”响应 需要注意的是,当您尝试登录到浏览器时,网页会将您引导到输入电子邮件并提交表单的位置 这将发送一个POST请求,只需提供电子邮件,如果一切顺利,该网页将使用JS“重定向”您并生成“密码”输入元素 一旦您填写密码并点击表单按钮,如果成功,它将重定向+生成登录响应,作为POST发送到的结果,以及电子邮件、pw和一些其他信息(可以在我的代码片段中找到) 首先,我尝

我想了解更多关于如何使用Scrapy登录网站的信息。我看了一些文档和教程,最后在。使用Chrome开发工具,我在从页面登录后查看“登录”响应

需要注意的是,当您尝试登录到浏览器时,网页会将您引导到输入电子邮件并提交表单的位置

这将发送一个POST请求,只需提供电子邮件,如果一切顺利,该网页将使用JS“重定向”您并生成“密码”输入元素

一旦您填写密码并点击表单按钮,如果成功,它将重定向+生成登录响应,作为POST发送到的结果,以及电子邮件、pw和一些其他信息(可以在我的代码片段中找到)

首先,我尝试一步一步地做:从.ca/signup开始,用我的电子邮件向查找端点发送帖子,但我得到了一个401错误。接下来,我尝试直接转到.ca/signup/login,并提交登录响应中找到的所有信息,但收到403

我确信我一定是遗漏了什么,尽管我似乎在发布到正确的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]调试:已爬网(403)(参考:https://www.eventbrite.ca/signin/login)
.ca/注册尝试(401):

[scrapy.core.engine]调试:已爬网(401)(参考:https://www.eventbrite.ca/signin/login)

您的头中似乎缺少
X-CSRFToken
。此令牌用于保护资源不受跨站点请求伪造的影响

在这种情况下,它是在cookies中提供的,您需要存储并传递它

一个对我有用的简单实现:

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!')
理想情况下,您希望创建一个中间件来为您做到这一点


通常,当您遇到这种行为时,您希望尽可能地模仿浏览器发送的内容,因此请仔细查看标题并尝试复制它们。

“首先,我尝试一步一步地执行此操作:从.ca/signup开始,用电子邮件将帖子发送到查找端点,但我遇到了一个401错误。”。然后继续操作,直到得到与web浏览器相同的响应。饼干可能很重要。瞧,呃,我知道这一定是我忽略的简单的事情。谢谢你的指导!
[scrapy.core.engine] DEBUG: Crawled (401) <POST https://www.eventbrite.ca/api/v3/users/lookup/> (referer: https://www.eventbrite.ca/signin/login)
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!')