繁体   English   中英

Scrapy Spider 无法登录 Discord

[英]Scrapy spider cannot log into discord

我正在尝试为 Discord 制作一个抓取工具以获取服务器的所有成员,但我在登录时卡住了,我在页面的源代码中的任何地方都找不到 csrf 令牌也许这就是我得到的原因这个错误是因为一些消息来源说它是必需的,但我不确定,这是我的蜘蛛导致的问题

from scrapy.http import FormRequest

class RecruteSpider(scrapy.Spider):
    name = "Recruteur"

    def start_requests(self)
        urls = [
            'https://discord.com/login',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.login)

    def login(self, response):

        url = 'https://discord.com/login'
        formdata = {"username":"SecretUserName", "password":"SecretPassword"}
        yield FormRequest.from_response(
            response = response,
            url = url,
            formdata = formdata,
            callback = self.afterLogin
        )


    def afterLogin(self, response):
        print("Success!!")
        #do stuff

我运行程序时出现错误

ValueError:在 <200 https://discord.com/login> 中找不到元素

即使该网址上显然有一个表单元素。

我也尝试使用登录 url 作为表单响应中的响应变量,但我收到错误

AttributeError: 'str' 对象没有属性 'encoding'

如果您需要任何额外的细节,请随时询问,非常感谢您的帮助,提前致谢。

您收到的错误是因为 discord 使用 javascript 加载/login页面,因此响应不包含任何表单元素。 您需要使用scrapy-playwright (个人最喜欢的)、 seleniumscrapy-splash来渲染javascript。

此外,您的formdata变量包含无效键。 在浏览器中查看发送到服务器的有效负载的屏幕截图。

请求有效载荷

使用scrapy-playwright ,我能够获得如下回调函数。 另请注意,一旦您发送登录请求,不和谐服务器可能会要求您解决验证码,这是您需要解决的另一个挑战。

不和谐.py

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy import FormRequest

class RecruteSpider(scrapy.Spider):
    name = "Recruteur"

    def start_requests(self):
        urls = ['https://discord.com/login']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.login, meta={"playwright": True})

    def login(self, response):
        url = 'https://discord.com/login'
        formdata = {"login":"SecretUserName", "password":"SecretPassword"}
        yield FormRequest.from_response(
            response = response,
            url = url,
            formdata = formdata,
            callback = self.afterLogin
        )

    def afterLogin(self, response):
        print("Success!!")
        #do stuff


if __name__ == "__main__":
    process = CrawlerProcess(settings={
        "TWISTED_REACTOR": "twisted.internet.asyncioreactor.AsyncioSelectorReactor",
        "DOWNLOAD_HANDLERS": {
            "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
        }, })
    process.crawl(RecruteSpider)
    process.start()

样本scrapy运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM