【发布时间】:2019-07-09 15:13:53
【问题描述】:
我正在使用https://www.fbo.gov/index?s=opportunity&tab=search&mode=list 上的表格。
我需要通过选中表单上该组中的一个或多个复选框来抓取给出的结果。据我了解,只需给一个复选框元素“checked”属性就代表一个复选框。如何在我的 FormRequest 中定义它?
这是我正在测试的输入元素
<div
id="div_dnf_class_values_procurement_notice__naics_code___0001_check"
>
<input
name="dnf_class_values[procurement_notice][naics_code][]"
type="checkbox"
value="0001"
id="dnf_class_values_procurement_notice__naics_code___0001_check"
class="input-checkbox"
>
<label
for="dnf_class_values_procurement_notice__naics_code___0001_check"
>
111 -- Crop Production
</label>
</div>
表单使用 POST 方法。这是我当前的代码:
import scrapy
class ContractsSpider(scrapy.Spider):
name = "contracts"
def start_requests(self):
url = 'https://www.fbo.gov/index?s=opportunity&tab=search&mode=list'
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
yield scrapy.FormRequest.from_response(
response,
formdata={'dnf_class_values[procurement_notice][naics_code][]' : '0001',
'dnf_class_values[procurement_notice][searchtype]' : 'active',
'dnf_class_values[procurement_notice][all_agencies]' : 'all',
'dnf_class_values[procurement_notice][recovery_act]' : '0'},
formname='vendor_procurement_notice_search',
callback=self.after_form,
method="POST",
)
def after_form(self, response):
filename = 'response.html'
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
return response
我是scrapy的新手,对我的formdata属性应该包含什么感到非常困惑? dict 中的额外元素只是表单中必需的字段单选框。不确定是否有必要在此处添加。 scrapy 的 FormRequest 文档非常简单,我遇到了很多麻烦。
我遵循了以下答案之一的建议并使用了输入元素的名称,但是有很多具有该名称的输入元素。另外,我将如何在一次提交中检查多个复选框?
我希望 after_form 函数将结果 html 写入文件,以便我知道它可以工作。
【问题讨论】: