在 ASP.net 网站上使用 robobrowser
Using robobrowser on ASP.net website
我已经为此工作了几天。无法真正找到如何使这项工作。我对 aspx 网站和从中获取信息还很陌生。
我正在尝试 login/authenticate 在使用 aspx 页面的网站上。所以我遵循了这个 thread 这真的帮助我启动了它。 (最后一个答案)
按照这些指示,我写:
url = "http://samplewebsite/Main/Index.aspx" # Logon page
username = "user"
password = "password"
browser = RoboBrowser(history=True)
# This retrieves __VIEWSTATE and friends
browser.open(url)
signin = browser.get_form(id='form1')
print(signin)
这是打印语句的结果:
<RoboForm __VIEWSTATE=/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==, __VIEWSTATEGENERATOR=E78488FE, adminid=, btnSubmit=, pswd=>
所以很明显我正在正确检索信息。现在我有 3 个输入字段:
adminid
btnSubmit
pswd
我可以通过以下方式使用它:
signin["adminid"].value = username
signin["pswd"].value = password
signin["btnSubmit"].value = "btnSubmit.x=29&btnSubmit.y=22"
我唯一的问题是最后一个字段 btnSubmit
,我不知道如何输入值,因为它属于以下类型:
<input type="image" name="btnSubmit" id="btnSubmit" tabindex="3" src="../image/login_btn.gif" style="height:41px;width:57px;border-width:0px;" />
当我在网站上提交时,使用 Chrome 工具我得到以下结果:
__VIEWSTATE:/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==
__VIEWSTATEGENERATOR:E78488FE
adminid:user
btnSubmit.x:23
btnSubmit.y:15
pswd:password
基本上 x,y
位置就是我在页面上单击的位置。真不知道如何通过Python做这个请求。使用 this 无济于事。
当你点击image
类型的输入对象时,会设置两个表单值,按钮名称加上.x
为第一个,和.y
另一个。
但是,在常规文本输入字段中按 Enter 也会提交表单,因此您 没有 单击一个提交按钮。我只是将值完全留空。
robobrowser 处理表单提交的方式没有太多灵活性,要避免使用提交按钮,您必须将其从表单中彻底删除:
del signin.fields['btnSubmit']
提交之前。
如果您必须使用图像按钮提交,那么您将必须教会 Robobrowser 如何处理该类型;目前它没有处理这些。下面补充说:
from functools import wraps
from robobrowser.forms import form
from robobrowser.forms.fields import Submit, Input
class ImageSubmit(Submit):
def serialize(self):
return {self.name + '.x': '0', self.name + '.y': '0'}
def include_image_submit(parse_field):
@wraps(parse_field)
def wrapper(tag, tags):
field = parse_field(tag, tags)
if type(field) is Input: # not a subclass, exactly this class
if field._parsed.get('type') == 'image':
field = ImageSubmit(field._parsed)
return field
return wrapper
form._parse_field = include_image_submit(form._parse_field)
此时您可以使用 browser.submit_form(signin, signin['btnSubmit'])
提交表单,正确的字段将被包括在内。
我已向 robobrowser
项目提交 pull request 以添加图像提交支持。
我已经为此工作了几天。无法真正找到如何使这项工作。我对 aspx 网站和从中获取信息还很陌生。
我正在尝试 login/authenticate 在使用 aspx 页面的网站上。所以我遵循了这个 thread 这真的帮助我启动了它。 (最后一个答案)
按照这些指示,我写:
url = "http://samplewebsite/Main/Index.aspx" # Logon page
username = "user"
password = "password"
browser = RoboBrowser(history=True)
# This retrieves __VIEWSTATE and friends
browser.open(url)
signin = browser.get_form(id='form1')
print(signin)
这是打印语句的结果:
<RoboForm __VIEWSTATE=/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==, __VIEWSTATEGENERATOR=E78488FE, adminid=, btnSubmit=, pswd=>
所以很明显我正在正确检索信息。现在我有 3 个输入字段:
adminid
btnSubmit
pswd
我可以通过以下方式使用它:
signin["adminid"].value = username
signin["pswd"].value = password
signin["btnSubmit"].value = "btnSubmit.x=29&btnSubmit.y=22"
我唯一的问题是最后一个字段 btnSubmit
,我不知道如何输入值,因为它属于以下类型:
<input type="image" name="btnSubmit" id="btnSubmit" tabindex="3" src="../image/login_btn.gif" style="height:41px;width:57px;border-width:0px;" />
当我在网站上提交时,使用 Chrome 工具我得到以下结果:
__VIEWSTATE:/wEPDwULLTE5ODM2NTU1MzJkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQlidG5TdWJtaXRriD1xvrfrHuJ/0xbQM08yEjyoUg==
__VIEWSTATEGENERATOR:E78488FE
adminid:user
btnSubmit.x:23
btnSubmit.y:15
pswd:password
基本上 x,y
位置就是我在页面上单击的位置。真不知道如何通过Python做这个请求。使用 this 无济于事。
当你点击image
类型的输入对象时,会设置两个表单值,按钮名称加上.x
为第一个,和.y
另一个。
但是,在常规文本输入字段中按 Enter 也会提交表单,因此您 没有 单击一个提交按钮。我只是将值完全留空。
robobrowser 处理表单提交的方式没有太多灵活性,要避免使用提交按钮,您必须将其从表单中彻底删除:
del signin.fields['btnSubmit']
提交之前。
如果您必须使用图像按钮提交,那么您将必须教会 Robobrowser 如何处理该类型;目前它没有处理这些。下面补充说:
from functools import wraps
from robobrowser.forms import form
from robobrowser.forms.fields import Submit, Input
class ImageSubmit(Submit):
def serialize(self):
return {self.name + '.x': '0', self.name + '.y': '0'}
def include_image_submit(parse_field):
@wraps(parse_field)
def wrapper(tag, tags):
field = parse_field(tag, tags)
if type(field) is Input: # not a subclass, exactly this class
if field._parsed.get('type') == 'image':
field = ImageSubmit(field._parsed)
return field
return wrapper
form._parse_field = include_image_submit(form._parse_field)
此时您可以使用 browser.submit_form(signin, signin['btnSubmit'])
提交表单,正确的字段将被包括在内。
我已向 robobrowser
项目提交 pull request 以添加图像提交支持。