- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Scrapy 来收集身份验证屏幕后面的一些黄金。该网站使用 ASP.net
并且 ASP 在整个表单中散布着一些愚蠢的隐藏字段(如 __VIEWSTATE
、__EVENTTARGET
)。
当我调用 FormRequest.from_response(response,...
时,我希望它自动从响应中读取这些隐藏字段并将它们填充到 formdata
字典中- 这就是 Scrapy's FormRequest 文档所说的应该做的。
但如果是这样的话,为什么只有当我明确列出这些字段并填充它们时登录过程才有效?
class ItsyBitsy(Spider):
name = "itsybitsy"
allowed_domains = ["website.com"]
start_urls = ["http://website.com/cpanel/Default.aspx"]
def parse(self, response):
# Performs authentication to get past the login form
sel = Selector(response)
return [FormRequest.from_response(response,
formdata={
'tb_Username':'admin',
'tb_Password':'password',
# The following fields should be auto populated, right?
# So why does removing 'em break the login (w/500 Server Error)
'__VIEWSTATE':
sel.xpath("//input[@name='__VIEWSTATE']/@value").extract(),
'__EVENTVALIDATION':
sel.xpath("//input[@name='__EVENTVALIDATION']/@value").extract(),
'__EVENTTARGET': 'b_Login'
},
callback=self.after_login,
clickdata={'id':'b_Login'},
dont_click=True)]
def after_login(self, response):
# Mmm, scrumptious
pass
<form id="form1" action="Default.aspx" method="post" name="form1">
<div>
<input type="hidden" value="" id="__EVENTTARGET" name="__EVENTTARGET">
<input type="hidden" value="" id="__EVENTARGUMENT" name="__EVENTARGUMENT">
<input type="hidden" value="/wEPDwULLTE2OTg2NjA1NTAPZBYCAgMPZBYGAgMPD2QWAh4Kb25rZXlwcmVzcwUlcmV0dXJuIGNsaWNrQnV0dG9uKGV2ZW50LCAnYl9Mb2dpbicpO2QCBQ8PZBYCHwAFJXJldHVybiBjbGlja0J1dHRvbihldmVudCwgJ2JfTG9naW4nKTtkAgcPD2QWAh4Hb25jbGljawUPcmV0dXJuIGxvZ2luKCk7ZGRKt/WTOQThVTxB9Y0QcIuRqylCIw==" id="__VIEWSTATE" name="__VIEWSTATE">
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<div>
<input type="hidden" value="/wEWBAK0o8DDCQLxz5rcDwLF8dCIDALHyYWSA+rA4VJNaEpFIycMDHQPUOz393TI" id="__EVENTVALIDATION" name="__EVENTVALIDATION">
<input type="text" onkeypress="return clickButton(event, 'b_Login');" size="28" class="textfield-text" id="tb_Username" name="tb_Username">
<input type="password" onkeypress="return clickButton(event, 'b_Login');" size="28" class="textfield-text" id="tb_Password" name="tb_Password">
<a href="javascript:__doPostBack('b_Login','')" class="button-link" id="b_Login" onclick="return login();">Login</a>
</form>
最佳答案
根据source code , Scrapy
使用以下 CSS 选择器来解析表单外的输入:
descendant::textarea|descendant::select|descendant::input[@type!="submit" and @type!="image" and @type!="reset"and ((@type!="checkbox" and @type!="radio") or @checked)]
换句话说,所有隐藏的输入都被成功解析(并在稍后与请求一起发送),其值等于 value
属性。所以,Scrapy 在这里做了它应该做的事情。
使用 from_response()
的登录不起作用,因为 __EVENTTARGET
具有空的 value
属性。如果您使用真实浏览器进行登录,__EVENTTARGET
参数值将通过 javascript __doPostBack()
函数调用设置为 b_Login
。并且,由于 Scrapy 无法处理 javascript(无法调用 js 函数),__EVENTTARGET
会发送一个空值,这会导致登录失败。
__EVENTARGUMENT
也有一个空的 value
,但它实际上在 __doPostBack()
函数中设置为空字符串,所以它不会在这里有所作为。
希望对您有所帮助。
关于python - Scrapy:FormRequest 不会自动填充 ASP.net 隐藏字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23577320/
不确定我是否有 Scrapy 或 Twisted 或 ???通过 easy_install 运行 Python 2.7 32 位和最新的 scrapy/依赖项 尝试模拟 POST 请求登录并使其正常工
在我的 Controller 中,我在验证之前有条件语句 if ($request->department == 5) { $this->validate($request, [ //
我是 Laravel 新手。 我想知道如何验证具有相同名称的多个输入。 我有一个 POST 请求的验证规则,但是虽然我有所有需要的值,但验证失败。 我注意到键名与用户输入的键名不同,所以我认为这是导致
我有一个如下所示的 FormRequest 类 'image|mimes:jpg,png,jpeg,|max:2048', ]; } } 如何在此处获取验证消息?就像
我正在抓取的网站有时会重定向到带有我想在下载器中间件中处理的表单的页面。这个想法是每次发生这种重定向时,它都会自动提交表单并检索结果。我的中间件看起来像: from scrapy import For
我尝试使用 FormRequest: class RegistrationForm extends FormRequest { public function authorize()
我有一个带有两个功能的 User 模型来检查用户的性别。对于特定的表单,我创建了一个 FormRequest目的。现在,我需要设置一些特定于用户性别的验证规则,即对于男性用户有一组规则,对于女性用户有
我正在尝试弄清楚如何在使用验证槽请求时将错误消息添加到由 Illuminate\Support\MessageBag 生成的默认 $error 中。 我在 google 和 laravel 文档上进行
我正在用 scrapy 编写一个网络爬虫来处理表单。问题是我遇到了一个包含大量同名输入的表单。标签如下: 唯一区分它们的是 ID 属性。我想用一些数字填充 ID='crn_id1' 的人。然而,
我正在使用 Scrapy 编写一个 python 脚本来抓取具有登录页面的网站。我正在尝试使用 Scrapy 中的 FormRequest.from_response 填写表单,但没有成功,不知道为什
我正在尝试学习 scrapy FormRequest 如何在网站上工作,我有以下 scrapy 代码: import scrapy import json from scrapy.utils.resp
这里是完整的 Python 新手,所以我可能会问一些非常明显的问题,但我已经搜索过这个网站、Scrapy 文档和 Google,我完全陷入了这个问题。 本质上,我想使用 Scrapy 的 FormRe
我有一个规则 (foobar),它不是 Laravel 内置的,我想在我的扩展 FormRequest 中使用。如何为该特定规则创建自定义验证器? public function rules() {
是否可以在我的函数中创建动态 FormRequest 验证?请参阅下面的示例代码。 public function store(Request $request) { Model::creat
我正在抓取此网页 https://researchgrant.gov.sg/eservices/advanced-search/?keyword=&source=sharepoint&type=pro
我正在尝试从“https://pagesjaunes.fr ”中抓取数据。我为了从pagesjaunes中抓取数据:电子邮件、地址等我首先要在 中提交数据 当我在网络 chrome 调试器中搜索以查看
我正在尝试学习Scrapy。我尝试在 Scrapy 中复制以下发布请求,但没有成功。我也尝试了 scrapy.Request(method='POST') 但它也不起作用。 import reques
我目前正在研究 FormRequest 对象,以使用它对传入数据执行身份验证和验证。但是,在使用模型注入(inject)时我无法让它工作。 路由.php: Route::model('post', '
我正在尝试抓取以下网站,其中分页是通过 AJAX 请求进行的。 http://studiegids.uva.nl/xmlpages/page/2014-2015/zoek-vak 我正在发送 Form
我正在尝试解析 this使用 Scrapy 的页面为了显示带有价格的隐藏文本,我在字段中输入了任何邮政编码或随机数字: 对于带有价格的响应 url,我尝试使用 yse FormRequest.fro
我是一名优秀的程序员,十分优秀!