Python 使用Scrapy登录EventBrite
我想了解更多关于如何使用Scrapy登录网站的信息。我看了一些文档和教程,最后在。使用Chrome开发工具,我在从页面登录后查看“登录”响应 需要注意的是,当您尝试登录到浏览器时,网页会将您引导到输入电子邮件并提交表单的位置 这将发送一个POST请求,只需提供电子邮件,如果一切顺利,该网页将使用JS“重定向”您并生成“密码”输入元素 一旦您填写密码并点击表单按钮,如果成功,它将重定向+生成登录响应,作为POST发送到的结果,以及电子邮件、pw和一些其他信息(可以在我的代码片段中找到) 首先,我尝试一步一步地做:从.ca/signup开始,用我的电子邮件向查找端点发送帖子,但我得到了一个401错误。接下来,我尝试直接转到.ca/signup/login,并提交登录响应中找到的所有信息,但收到403 我确信我一定是遗漏了什么,尽管我似乎在发布到正确的URL并找到正确的表单,但我不知道还剩下什么。同样,在尝试了一段时间之后,我想知道Selenium是否能提供一个更好的选择来登录一个有大量JS的网页,并对其进行一些自动化。谢谢你的帮助Python 使用Scrapy登录EventBrite,python,authentication,scrapy,eventbrite,Python,Authentication,Scrapy,Eventbrite,我想了解更多关于如何使用Scrapy登录网站的信息。我看了一些文档和教程,最后在。使用Chrome开发工具,我在从页面登录后查看“登录”响应 需要注意的是,当您尝试登录到浏览器时,网页会将您引导到输入电子邮件并提交表单的位置 这将发送一个POST请求,只需提供电子邮件,如果一切顺利,该网页将使用JS“重定向”您并生成“密码”输入元素 一旦您填写密码并点击表单按钮,如果成功,它将重定向+生成登录响应,作为POST发送到的结果,以及电子邮件、pw和一些其他信息(可以在我的代码片段中找到) 首先,我尝
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!')