scrapy 重新格式化循环以保存数据的每次迭代

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

很抱歉问了这么一个基本的问题,但我是编码新手,仍然很难操纵循环/使用不熟悉的库。
我有一段代码,它应该将解析后的数据保存在Excel文件中。但是,它只保存了循环的最后一次迭代。下面是我当前的代码

auto = pd.read_stata(r"D:\StataCopies\workersurlsSample.dta")
df = pd.DataFrame(auto)

filename = r'C:\Users\nglew\Desktop\writingpractice2.xlsx'

i = 0
while i<3:
    class QuotesSpider(scrapy.Spider):
        name = "spider"
        start_urls = [
            df.iloc[i,3]
            ]
        def parse(self, response):
            trs = response.css('span.wikibase-title')
            if trs:
                items = []
                for quote in trs:
                    item = {
                        quote.css('span.wikibase-title-id::text').get().replace('(','').replace(')',''),
                    }
                    items.append(item)

                    df2 = pd.DataFrame(items)
                    with pd.ExcelWriter(filename, mode='a', engine="openpyxl", if_sheet_exists='overlay') as writer:
                        df2.to_excel(writer, sheet_name='Sheet1', startrow=i + 1)
    i += 1

该代码从我在Stata中的数据库中抓取URL,然后从每个URL中解析数据。
结果应该是一个具有'Q 000000'格式的代码列表。但我只得到了一个单一的代码,当i=2时,而不是3个单独的代码。这是我在excel中的结果
Excel Output
我如何重新格式化循环,以便不仅保存最后一次迭代,而且保存从i=0到i=2的每次迭代?

olmpazwi

olmpazwi1#

这不是最有效的解决方案,但您可以检查文件是否存在,如果存在,则读取它,然后追加新行。
另外,你的df2 = pd.DataFrame(items)调用应该少一个缩进,否则,你将为for/loop的每次迭代创建一个新的 Dataframe 并保存它。


# Extra import you'll need to check whether the file exists.

# You could also use Path from pathlib, but `os.path` should do the trick

import os

auto = pd.read_stata(r"D:\StataCopies\workersurlsSample.dta")
df = pd.DataFrame(auto)

filename = r'C:\Users\nglew\Desktop\writingpractice2.xlsx'
sheet_name='Sheet1'

i = 0
while i < 3:

    class QuotesSpider(scrapy.Spider):
        name = "spider"
        start_urls = [df.iloc[i,3]]

        def parse(self, response):

            trs = response.css('span.wikibase-title')
            if trs:
                items = [
                    item = {
                        quote.css('span.wikibase-title-id::text').get().replace('(','').replace(')',''),
                    } for quote in trs
                ]
                df2 = pd.DataFrame(items)
                if os.path.exists(filename):
                    df_temp = pd.read_excel(filename, sheet_name=sheet_name)
                    df2 = pd.concat([df_temp, df2], axis=0)
                df2.to_excel(filename, sheet_name=sheet_name, index=False)
    i += 1

我还建议不要在while/loop内创建新的class,为什么不在while/loop外定义class,创建它的示例,然后直接在while语句内调用它的方法呢?

相关问题