【问题标题】:unable to authenticate to fandromeda using scrapy无法使用 scrapy 向 fandromeda 进行身份验证
【发布时间】:2016-12-01 05:33:09
【问题描述】:

我是 scrapy 的新手,并试图从 fandromeda.com 网站上抓取一些数据,但我需要先进行身份验证,然后才能开始抓取以下 URL 上的所需数据

https://fandromeda.com/v2/event/results

我正在尝试使用 from_response 方法来尝试登录网站

import scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request, FormRequest
from scrapy.selector import Selector
from fandromeda.items import FandromedaItem

class FandromedaC(CrawlSpider):
    name = 'fandromeda_c'
    allowed_domains = ['fandromeda.com']
    start_urls = ['https://fandromeda.com/user/signin']

    def parse(self, response):

        sel = Selector(response)
        sign_in = sel.xpath('//button[@type="submit"]/text()').extract()

        if sign_in:
            if sign_in[0] == "SIGN IN":
                self.log("$$$$$$$$$$$$$$$$$$")
                form_data = {'username': 'xxxx','password': 'xxxx' }
                return scrapy.FormRequest.from_response(response,formdata=form_data,callback=self.parse_login_response)

    def parse_login_response(self,response):
        self.log("#####################")
        self.log(response.status)

我希望被重定向到主页并获得该内容作为响应,但我得到的只是再次登录页面。

我注意到在默认情况下,scrapy 正在发出获取请求而不是发布。 2016-12-01 10:53:44 [scrapy] 调试:已爬网 (200) https://fandromeda.com/user/signin?handle=&username=xxxx&password=xxxx>(引用者:https://fandromeda.com/user/signin)

我尝试在响应中使用方法参数来强制scrapy使用POST方法

scrapy.FormRequest.from_response(response,method="POST",formdata=form_data,callback=self.parse_login_response)

现在,scrapy 发出了 post 请求,但结果有所不同。 有人可以指出我需要做什么的正确方向吗?

【问题讨论】:

    标签: authentication scrapy http-post


    【解决方案1】:

    该网站使用大量的 AJAX 调用来执行操作,他们使用 AJAX 来登录用户。

    您使用错误的 URL 登录网站。

    这是我为登录该网站而编写的代码,它的 100% 工作代码

    # -*- coding: utf-8 -*-
    from scrapy.http import FormRequest
    from scrapy.http.request import Request
    from scrapy.selector import HtmlXPathSelector
    from scrapy.selector import Selector
    from scrapy.spiders import CrawlSpider
    from scrapy.utils.response import open_in_browser
    
    class FandromedaCSpider(CrawlSpider):
        name = 'fandromeda_c'
        allowed_domains = ['fandromeda.com']
    
        def start_requests(self):
    
            form_data = {"username":"mani619cash@gmail.com","password":"mani619cash@gmail.com"}
            yield FormRequest('https://fandromeda.com/user/logreg/login', callback=self.parse_login_response, formdata=form_data)
    
        def parse_login_response(self,response):
            open_in_browser(response)
    

    我还把整个项目推到了 Github 这里https://github.com/mani619cash/fandromeda_login你可以下载并运行它...

    您必须查看 Firebug 才能看到他们正在使用的 AJAX 调用...例如加载用户配置文件,他们通过 AJAX 向此 URL https://fandromeda.com/user/profile/info.json 发送 GET 请求

    见

    PS:

    这是一个技巧......当你在研究你试图抓取的网站时,总是在浏览器中禁用 JS......因为,如果数据在浏览器中显示而 JS 被禁用,那么它 100% 肯定他们不使用AJAX 或一些页面上的 JS 来操作数据....如果您在禁用 JS 后在浏览器中没有您想要的数据,那么可以肯定他们正在使用 AJAX 或页面上的 JS 来呈现/加载数据......使用这是在浏览器上切换 JS https://chrome.google.com/webstore/detail/quick-javascript-switcher/geddoclleiomckbhadiaipdggiiccfje?hl=en

    【讨论】:

    • 非常感谢@Umair。我会试试这个,让你知道结果并将其标记为答案。关于这一点还有一个问题,您是否可以扩展代码以对另一页面进行额外调用,例如“fandromeda.com/v2/event/results”。 scrapy 会负责传递必要的参数,还是每次请求页面时我都必须登录?只是不确定后续页面抓取的正确方法是什么。
    • 正如我已经告诉你的那样,他们在他们的网站上使用了太多的 AJAX。 fandromeda.com/v2/event/results 链接也使用 AJAX .... 请参阅 screesnhot 他们将 AJAX 发送到 fandromeda.com/v2/event/result_json URL 以加载结果数据
    • 一旦你使用scrapy登录,scrapy会自动创建会话并维护cookies,你不必在访问每个URL之前登录
    • 谢谢 我现在知道如何解析这个网站了。我需要对各种 URL 进行一系列 GET/POST 调用以接收数据并解析 JSON 响应。再次非常感谢这个解决方案
    • 是的,保持浏览器的检查视图(如果您有 Firefox,则为 Firebug)并查看他们正在使用的 AJAX 调用......我确信他们只使用 AJAX 来加载每个页面上的所有数据...... .有些网站不使用AJAX,那么您可以使用浏览器中的链接,这样就可以了...
    【解决方案2】:

    他们的登录页面接受 JSON 而不是带有值的简单表单。

    不要使用formdata=form_data,而是使用formdata=json.dumps(form_data)

    【讨论】:

    • 当我使用这个“ValueError: formdata should be a dict or iterable of tuples”时出现以下错误
    • 查看我的新答案 ,,, 我已经为你创建了一个完整的工作代码
    猜你喜欢
    • 2019-08-09
    • 2013-05-30
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2016-10-11
    相关资源
    最近更新 更多