我希望了解更多关于如何使用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页面上执行一些自动化操作。感谢您的帮助。
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):
[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)发布于 2019-10-03 06:11:12
看起来您的标头中缺少X-CSRFToken。此令牌用于保护资源免受跨站点请求伪造。
在这种情况下,它是在cookie中提供的,您需要存储它并传递它。
一个适用于我的简单实现:
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!')理想情况下,您会希望创建一个中间件来为您完成此操作。
通常,当您面对这种行为时,您希望尽可能地模仿浏览器发送的内容,因此请仔细查看标头,并尝试复制它们。
https://stackoverflow.com/questions/58191094
复制相似问题