将处理后的结果写入 JSON 个文件

Write processed results in JSON files

我正在使用 Scrapy 进行广泛的爬取,并且有以下要求:

  1. Scrapy 会抓取 URL;
  2. Scrapy 将解析来自 URL 的响应并将解析结果写入文件,比如 file1.json,当且仅当 file1.json 的大小小于 2GB。否则,Scrapy 将创建一个新文件,比如 file2.json 并将响应写入这个新文件;
  3. 一旦响应返回,Scrapy 将从响应中提取 URL 并跟随提取的响应。然后从第2点开始。

下面是我的代码,我可以执行第 1 步和第 3 步,但无法理解我应该将 creating the new filechecking the sizewriting the response 的逻辑放在哪里.

def parse(self, response):

    url = response.request.url
    soup = BeautifulSoup(response.text, 'lxml')

    d = {}
    for element in soup.find_all():
        if element.name in ["html", "body", "script", "footer"]:
            pass

        else:
            x = element.find_all(text=True, recursive=False)
            if x:
                d[element.name] = x

    yield d ---------> I want to write this dictionary in a file as per logic of step 2

    for link in soup.find_all('a', href=True):
        absoluteUrl = urllib.parse.urljoin(url, link['href'])
        parsedUrl = urlparse(absoluteUrl)
        if parsedUrl.scheme.strip().lower() != 'https' and parsedUrl.scheme.strip().lower() != 'http':
            pass
        else:

            url = url.replace("'", r"\'")
            absoluteUrl = absoluteUrl.replace("'", r"\'")

            self.graph.run(
                "MERGE (child:page{page_url:'" + url + "'}) " +
                "On CREATE " +
                "SET child.page_url='" + url + "', child.page_rank = 1.0 " +
                "MERGE (parent:page{page_url:'" + absoluteUrl + "'}) " +
                "On CREATE " +
                "SET parent.page_url = '" + absoluteUrl + "' , parent.page_rank = 1.0 " +
                "MERGE (child)-[:FOLLOWS]->(parent)"
            )

            yield response.follow(absoluteUrl, callback=self.parse). ---> Step 3 ( all good ) 

我的问题是我应该在哪里编写创建文件、检查文件大小以及将蜘蛛响应写入该文件的逻辑(应该在管道、中间件或蜘蛛的初始化函数中)?

如有任何帮助,我们将不胜感激。我尝试学习中间件、管道等,但无法弄清楚如何实现此功能。

如果您知道每个文件在不超过 2GB 限制大小的情况下应该包含的项目的大概数量,那么您可以开箱即用地使用 FEED_EXPORT_BATCH_ITEM_COUNT 设置,并且 scrapy 会在数量达到时自动创建新文件文件中的项目数达到上述限制。在 FEEDS 页面上阅读有关此设置的更多信息。