为什么这个FormRequest不会让我登录?

时间:2015-06-29 06:47:21

标签: python scrapy scrapy-spider

完整的Python newb在这里,所以我可能会问一些非常明显的东西,但我搜索过这个网站,Scrapy文档和谷歌,我完全坚持这个问题。

基本上,我想使用Scrapy的FormRequest将我登录到一个站点,以便我可以从各个页面中搜集和保存一些统计信息。问题是我在提交表单后从网站收到的响应只是将我返回主页(在响应正文中没有任何登录错误通知)。我不确定我是如何破坏这个登录过程的。虽然它是一个弹出式登录表单,但我不认为这应该是一个问题,因为使用Firebug,我可以为网页中嵌入的表单提取相关的html代码(和xpath)。

感谢您的帮助。代码粘贴在下面(我替换了我的实际用户名和密码):

# -*- coding: utf-8 -*-
import scrapy

class dkspider(scrapy.Spider):

    name = "dkspider"
    allowed_domains = ["draftkings.com"]
    start_urls = ['https://www.draftkings.com/contest-lobby']

    def parse(self, response):
        return scrapy.http.FormRequest.from_response(response,
                formxpath = '//*[@id="login_form"]',
                formdata = {'username' : 'myusername', 'password' : 'mypass'},
                callback = self.started)

    def started(self, response):
        filename = 'attempt1.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        if 'failed' in response.body:
            print 'Errors!'
        else:
            print 'Success'

1 个答案:

答案 0 :(得分:1)

似乎您的参数不匹配(应该是login而不是username),而您在formdata中缺少其中一些参数。这是firebug告诉我在尝试登录时交付的内容:
Post parameters

似乎layoutTypereturnUrl可以硬编码,但需要从页面源检索profillingSessionId。我检查了源头,发现了这个:
html sessionid
所以你的蜘蛛看起来应该是这样的:

def parse(self, response):
    return FormRequest(
        url='https://www.draftkings.com/account/login',
        formdata={'login': 'login',  # login instead of username
                               'password': 'password',
                               'profillingSessionId': ''.join(
                                   response.xpath("//input[@id='tmxSessionId']/@value").extract()), 
                               'returnUrl': '', 
                               'layoutType': '2'}, 
        callback=self.started)

def started(self, response):
    # Reload the landing page
    return Request(self.start_urls[0], self.logged_in)

def logged_in(self, response):
    # logged in page here
    pass