禁赌毒 2024-02-05 15:49 采纳率: 50%
浏览 5

爬取数据与本地数据合并问题

需求:从网上爬取的数据,如果本地没有文件,则新建文件并写入,如果本地有文件,则从爬取的数据中筛选掉已有数据,剩下更新的数据写入文件(追加更新)
问题:爬取的数据(已清洗过)与本地读取的数据合并后,相同(内容相同,格式也转化一致)的数据并没有出现both,所以导致无法筛选出更新数据,问题出在哪儿


    list_name = []
    list_date = []
    list_funds = []
    filepath = './plate.csv'
    for i in list_plate:
        headers_detail = {
            'Host': 'xxxxxxx',
            'Referer': f'https://yyyyyy.com/{i}.html',
            'User-Agent': 'xxxxxxx'
        }

        params = {
            'xx': 'xxx'
        }

        res = requests.get(url, headers=headers_detail, params=params).text
        pat_klines = '"klines":(.*?)}'
        klines = re.compile(pat_klines).findall(res)[0]
        lists = ast.literal_eval(klines)
        for j in lists:
            pat_name = '"name":"(.*?)"'
            name = re.compile(pat_name).findall(res)[0].replace(' ', '')
            list_name.append(name)
            x = j.split(',')
            date = x[0].replace(' ', '')
            list_date.append(date)
            funds_main = int(x[1].replace('.0', '').replace(' ', ''))
            list_funds.append(funds_main)

    data = {
        '板块名称': list_name,
        '日期': list_date,
        '主力资金': list_funds_main
    }

    df = pd.DataFrame(data).drop_duplicates()
    df['主力资金'] = np.array(df['主力资金']).astype(int)
    df['日期'] = np.array(df['日期']).astype(str)
    df['板块名称'] = np.array(df['板块名称']).astype(str)
    # df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d').dt.strftime('%Y/%m/%d')
    key_columns = ['板块名称', '日期', '主力资金']
    if not os.path.exists(filepath):
        df.to_csv(filepath, index=False, encoding='GBK')
    else:
        existing_data = pd.read_csv(filepath, encoding='GBK').drop_duplicates()
        existing_data['主力资金'] = np.array(existing_data['主力资金']).astype(int)
        existing_data['日期'] = np.array(existing_data['日期']).astype(str)
        existing_data['板块名称'] = np.array(existing_data['板块名称']).astype(str)
        new_data = pd.merge(df, existing_data, on=key_columns, how='outer', indicator=True)
        new_data = new_data[new_data['_merge'] == 'left_only']
        new_data = new_data.drop(columns='_merge', axis=1)
        print(new_data )
  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-05 15:51
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从您给出的代码来看,问题可能出在数据合并部分。您使用了 pd.merge 函数,并指定了 how='outer'_merge 指标来筛选出仅在左侧(即新爬取的数据df)存在的行。然而,在 on=list(existing_data.columns) 这一行中,您将所有列都设置为了连接键,这会导致只有完全新的记录才会出现在结果中。

    如果要筛选出爬取数据中与本地已有数据不同的更新数据,您可以尝试以下方法:

    # 确保 '板块名称', '日期' 是字符串类型,并且已经排序(以便正确合并)
    df = df.sort_values(by=['板块名称', '日期'])
    existing_data = existing_data.sort_values(by=['板块名称', '日期'])
    
    # 使用 '板块名称' 和 '日期' 作为连接键
    key_columns = ['板块名称', '日期']
    
    if not os.path.exists(filepath):
        df.to_csv(filepath, index=False, encoding='GBK')
    else:
        # 使用 'left_only' 合并策略找出新数据
        new_data = pd.merge(df, existing_data, on=key_columns, how='outer', indicator=True)
        new_data = new_data[new_data['_merge'] == 'left_only'].drop(columns='_merge')
    
        # 将新的或更新的数据追加到本地文件
        new_data.to_csv(filepath, mode='a', header=False, index=False, encoding='GBK')
    

    这样,new_data 中就只会包含爬取数据中未在本地文件中存在的新记录或者已存在记录的新版本(按'板块名称'和'日期'字段判断)。然后将其追加写入本地csv文件。注意这里假设df中的数据已经是清洗过且格式化一致的。

    评论

报告相同问题?

问题事件

  • 修改了问题 2月5日
  • 创建了问题 2月5日

悬赏问题

  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统