欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 09:58:43
...

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.csdn.net/jusang486/article/details/83012678