Scrapy:升级管道以发送项目

iswrvxsc  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(113)

我在www.example.com中有一个类pipelines.py,它将和线程发送到我的服务器的API:

class MyPipeline:
    def process_item(self, item, spider):
        data = {
            "source_id": 'name_of_the_running_spider,
            "token": "token",
            "products": [dict(item)],
        }
        headers = {'Content-Type': 'application/json'}
        url = 'http://for.example.com/my-api/'
        requests.post(url=url, headers=headers, data=json.dumps(data))
        return item

问题是管道每次都在一个项目("products": [dict(item)])下发送。是否有可能以某种方式将一个列表项目传递给**“products”**(例如[dict(item)*10])?如果在spider本身中,它可以使用循环和计数器进行组织,但如何通过www.example.com实现它pipeline.py

vktxenjb

vktxenjb1#

经过一些测试之后,我提出了一个可能的解决方案,通过将每个项目存储在列表中,并使用一个单独的方法来管理收集的项目数,并在列表长度达到某个阈值时自动触发请求,从而为管道添加功能,然后在pipelines close_spider方法中检查是否还有未发送的请求,并发送这些请求。
对于蜘蛛名称,pipelines process_item方法接收spider的示例,因此要获取spider的name属性,只需使用spider.name即可。相反,如果您试图获取spider类的名称,则可以对type(spider)执行一些regex操作,或者简单地将类名作为属性添加到spider并使其通过spider.classname .
例如:

一个月六个月一次

class MyPipeline:

    def __init__(self):
        self._request_data = []
        self._url = 'http://for.example.com/my-api/'
        self._headers = {'Content-Type': 'application/json'}
        self._max_number_of_requests = 10

    def process_item(self, item, spider):
        spidername = spider.name
        if len(self._request_data) >= self._max_number_of_requests:
            self.send_post_request(spidername)
        self._request_data.append(item)
        return item

    def send_post_request(self, spidername):
        data = {"source_id": spidername,
                "token": "token",
                "products": self._request_data}
        response = requests.post(url=self._url,
                                 headers=self._headers,
                                 data=json.dumps(data))
        if response.status_code != 200:
            print(f"REQUEST FAILED: status code {response.status_code}")
        self._request_data = []

    def close_spider(self, spider):
        if len(self._request_data) > 0:
            self.send_post_request(spider.name)

相关问题