首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Scrapy登录EventBrite

使用Scrapy登录EventBrite
EN

Stack Overflow用户
提问于 2019-10-02 03:24:39
回答 1查看 85关注 0票数 0

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

需要注意的是,当您尝试登录浏览器时,网页会将您引导至https://eventbrite.ca/signin,您可以在其中输入电子邮件并提交表单。

这将向https://www.eventbrite.ca/api/v3/users/lookup/发送一个POST请求,其中只包含所提供的电子邮件,如果一切正常,网页将使用JS将您“重定向”到https://eventbrite.ca/signin/login并生成"password“输入元素。

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

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

我确信我一定遗漏了什么,尽管我似乎POSTing到了正确的URL并找到了正确的形式,但我不知道剩下的是什么。同样,在尝试了一段时间之后,我想知道Selenium是否会提供一个更好的替代方案来登录并在包含大量JS的web页面上执行一些自动化操作。感谢您的帮助。

代码语言:javascript
复制
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/signup/login尝试(403):

代码语言:javascript
复制
 [scrapy.core.engine] DEBUG: Crawled (403) <POST https://www.eventbrite.ca/ajax/login/> (referer: https://www.eventbrite.ca/signin/login)

.ca/注册尝试(401):

代码语言:javascript
复制
[scrapy.core.engine] DEBUG: Crawled (401) <POST https://www.eventbrite.ca/api/v3/users/lookup/> (referer: https://www.eventbrite.ca/signin/login)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 06:11:12

看起来您的标头中缺少X-CSRFToken。此令牌用于保护资源免受跨站点请求伪造。

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

一个适用于我的简单实现:

代码语言:javascript
复制
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!')

理想情况下,您会希望创建一个中间件来为您完成此操作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58191094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档