完整的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'
答案 0 :(得分:1)
似乎您的参数不匹配(应该是login
而不是username
),而您在formdata
中缺少其中一些参数。这是firebug告诉我在尝试登录时交付的内容:
似乎layoutType
和returnUrl
可以硬编码,但需要从页面源检索profillingSessionId
。我检查了源头,发现了这个:
所以你的蜘蛛看起来应该是这样的:
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