HTTP POST 和使用 Scrapy 解析 JSON

Posted

技术标签:

【中文标题】HTTP POST 和使用 Scrapy 解析 JSON【英文标题】:HTTP POST and parsing JSON with Scrapy 【发布时间】:2014-01-27 21:49:20 【问题描述】:

我有一个要从中提取数据的网站。数据检索非常简单。

它使用 HTTP POST 获取参数并返回一个 JSON 对象。所以,我有一个我想要执行的查询列表,然后每隔一段时间重复一次以更新数据库。 scrapy 适合这个还是我应该使用其他东西?

我实际上不需要关注链接,但我确实需要同时发送多个请求。

【问题讨论】:

【参考方案1】:

POST 请求看起来如何?有许多变体,例如简单的查询参数 (?a=1&b=2)、类似表单的有效负载(正文包含 a=1&b=2)或任何其他类型的有效负载(正文包含某种格式的字符串,例如 json 或 xml)。

在 scrapy 中发出 POST 请求相当简单,请参阅:http://doc.scrapy.org/en/latest/topics/request-response.html#request-usage-examples

例如,您可能需要这样的东西:

    # Warning: take care of the undefined variables and modules!

    def start_requests(self):
        payload = "a": 1, "b": 2
        yield Request(url, self.parse_data, method="POST", body=urllib.urlencode(payload))

    def parse_data(self, response):
        # do stuff with data...
        data = json.loads(response.body)

【讨论】:

【参考方案2】:

对于处理请求和检索响应,scrapy 绰绰有余。要解析 JSON,只需使用标准库中的 json 模块即可:

import json

data = ...
json_data = json.loads(data)

希望这会有所帮助!

【讨论】:

我知道如何处理 JSON 响应,但 scrapy 不需要设置 start_urls 和规则来设置我的回调?【参考方案3】:

根据我对问题的理解,您只想以特定的时间间隔从网页中获取/抓取数据。 Scrapy 一般用于爬取。

如果您只想发出 http post 请求,您可以考虑使用python requests 库。

【讨论】:

我希望它同时获取多个数据点,然后等待一定的时间间隔再继续。这就是为什么我认为我会使用scrapy,因为它支持这一点。如果我使用请求模块,那么我必须一次完成一个。 我的意思是异步的。 我在考虑是否可以设置来自 CrawlSpider 类的请求。 我仍然不确定你为什么需要使用scrapy。它用于在网络图上爬行并抓取内容,但您似乎没有这样做。使用grequests 库可以实现异步请求。看看this的问题。

以上是关于HTTP POST 和使用 Scrapy 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

scrapy框架之递归解析和post请求

爬虫学习 12.scrapy框架之递归解析和post请求

scrapy框架之递归解析和post请求

爬虫2.3-scrapy框架-postshell验证码

scapy2 爬取全站,以及使用post请求

scrapy 发post请求