scrapy 将处理结果写入JSON文件

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

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

  1. Scrapy将抓取URL;
    1.当且仅当file1.json的大小小于2GB时,Scrapy将解析来自URL的响应,并将解析的结果写入文件,例如file1.json。否则,Scrapy将创建一个新文件,例如file2.json,并将响应写入该新文件;
    1.一旦返回响应,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 )

我的问题是,我应该在哪里编写创建文件、检查文件大小和将蜘蛛响应写入该文件的逻辑(应该在管道、中间件还是蜘蛛的init函数中)?
任何帮助都将不胜感激。我尝试学习中间件,管道等,但不能弄清楚如何实现这个功能。

h5qlskok

h5qlskok1#

如果您知道每个文件在不超过2GB限制大小的情况下所能容纳的大致项目数,那么您可以使用FEED_EXPORT_BATCH_ITEM_COUNT设置,当文件中的项目数达到上述限制时,Scrapy将自动创建新文件。

相关问题