在Scrapy爬虫中,`FormRequest` 是一种用于处理HTML表单提交的重要工具。它允许我们在爬取过程中模拟用户的交互,向目标网站发送POST请求,并携带表单数据。`formdata` 参数在`FormRequest` 中扮演关键角色,用来定义要提交的数据。
1. 基础用法:
当表单数据存储在字典`myFormData`中,如`{'name': 'John Doe', 'age': '27'}`,直接作为`formdata`参数传递。例如:
```python
yield scrapy.FormRequest(url="http://www.example.com/post/action",
headers=unicornHeader,
method='POST',
formdata=myFormData,
meta=customerData,
callback=self.after_post,
errback=self.error_handle,
dont_filter=True
)
```
这里,`headers`用于设置请求头信息,`method`指定请求类型,`meta`用于传递额外数据到回调函数,`callback`和`errback`分别对应成功和失败后的回调处理。
2. 复杂表单数据处理:
当遇到表单数据结构较为复杂,如嵌套字典的情况,比如亚马逊商品列表爬取中的例子,`formdata`可能需要调整。在这种场景下,你需要将这些嵌套数据转化为`FormRequest`可以接受的键值对形式。例如,如果`productSearchRequestData`字典是请求的一部分,你可能需要先进行序列化:
```python
def prepare_search_data(data):
serialized_data = {
'marketplaceID': data['marketplaceID'],
'seller': data['seller'],
'productSearchRequestData': json.dumps(data['productSearchRequestData']),
# 可能还需要处理其他嵌套字段
}
return serialized_data
serialized_search_data = prepare_search_data({
'marketplaceID': 'ATVPDKIKX0DER',
'seller': 'A2FE6D62A4WM6Q',
'productSearchRequestData': {"..."}
})
yield scrapy.FormRequest(url="http://www.example.com/sp/ajax/products",
headers=...,
method='POST',
formdata=serialized_search_data,
...
)
```
在这里,我们首先定义了一个辅助函数`prepare_search_data`,将嵌套字典转成JSON字符串,然后作为`formdata`的键值对形式传递。
`scrapy.FormRequest`的`formdata`参数允许你在爬虫中灵活地处理各种复杂的表单数据提交需求。通过正确处理嵌套字典,可以确保数据被正确地转换和发送。同时,理解如何利用`headers`、`method`等其他参数以及`meta`的传递机制,可以让你的爬虫更加精准和高效地完成任务。