使用Scrapy登录EventBrite

2024-04-16 08:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想了解更多关于如何使用Scrapy登录网站。我看了一些文档和教程,最后来到了Using FormRequest.from_response() to simulate a user login。使用chromedev工具,我查看从页面https://eventbrite.ca/signin/login登录后的“login”响应。你知道吗

需要注意的是,当您尝试登录浏览器时,网页会将您指向https://eventbrite.ca/signin,在那里输入电子邮件并提交表单。你知道吗

这会向https://www.eventbrite.ca/api/v3/users/lookup/发送一个POST请求,只提供电子邮件,如果一切顺利,网页将使用JS将您“重定向”到https://eventbrite.ca/signin/login,并生成“password”输入元素。你知道吗

一旦您填写了密码并点击表单按钮,如果成功,它将重定向+生成登录响应,作为发送到https://www.eventbrite.ca/ajax/login/的POST的结果,包含电子邮件、pw和一些其他信息(可以在我的代码片段中找到)。你知道吗

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

我肯定我错过了一些东西,虽然它似乎我张贴到正确的网址,并找到正确的形式,但不能找出剩下什么。在尝试了一段时间之后,我想知道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)

Tags: fromhttps网页电子邮件emailresponsewwwlogin
1条回答
网友
1楼 · 发布于 2024-04-16 08:13:16

看起来您的头中缺少了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!')

理想情况下,您可能希望创建一个中间件来为您做到这一点。你知道吗

一般来说,当您面对这种行为时,您希望尽可能地模仿浏览器发送的内容,因此请仔细查看标题并尝试复制它们。你知道吗

相关问题 更多 >