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