Scrapy基础知识之发送POST请求:

本文详细介绍了如何在Scrapy中使用FormRequest和Request方法发送POST请求。通过实例展示了重写start_requests方法,以及如何设置URL、formdata和回调函数。同时,文章分享了作者在处理特定POST请求时遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Scrapy默认发送的是get请求,当我们需要发送携带参数的请求时,是需要使用 post 请求。

那么可以使用 yield scrapy.FormRequest(url, formdata, callback)方法来发送POST请求。

2. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的start_requests(self) 方法,并且不再调用start_urls里的url。 示例如下:

# 示例
class MySpider(scrapy.Spider):
    name = 'myspider'
    # start_urls = ["http://www.example.com/"]
    
    # 方法重写
    def start_requests(self):
        url = 'http://www.XXX.com'

        # FormRequest 是Scrapy发送POST请求的方法
        #这里的formdata相当于request模块中的data参数,并以键值对形式(key-value)
        yield scrapy.FormRequest(
            method = 'POST', 
            url = url,
            formdata = {'ID' : 'xxx', 'password' : 'xxx'},
            callback = self.parse
        )

    def parse(self, response):
        # do something
        print(response.url)
        data = response.body.decode('utf-8')
        ...

这是个值得推荐的方法,遗憾的是上面scrapy.FormRequest()方法却没有解决我遇到的问题。。。。

最后还是采用scrapy.Request()方法处理了。

    def start_requests(self):

        # FormRequest 是Scrapy发送POST请求的方法,但是没有解决问题
        # yield scrapy.FormRequest(
        #     headers={'Content-Type': 'application/json'},
        #     method = 'POST',
        #     url = IP_PORT,
        #     formdata = json.dumps(self.data)
        #     callback = self.parse
        #     # dont_filter = True
        # )

        # 最后不得不采用request直接解决了。。
        yield scrapy.Request(url = IP_PORT, method='POST',
                                  body=json.dumps(self.data),
                                  headers={'Content-Type':'application/json'},callback = self.parse)

具体原因(巨坑)见下一篇的分析

https://blog.youkuaiyun.com/jusang486/article/details/83012678

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值