Python批量爬取数据与去重方法

在进行英文取名项目对数据的爬取与分析中,经常会对已经存储的批量数据去获取更多有效的数据,这个时候我们需要考虑去重复问题,以及在高频率访问网站导致连接超时中断等问题。

1. 去重复解决方法

设置缓冲区:当我们进行批量处理时,也许会发现在过万条数据里面存在些许重复项数据,这个时候如果我们针对这些数据继续去获取更多的数据时,依然会得到无效的重复项数据,同时考虑到程序容易中断问题,在对数据进行 “a” (追加)操作时,经常会导致原本获取的大量数据又得重新再次爬取,所以本人想到如下方法:

1.1在爬虫的时候使用异常处理方法

利用try-except方法:

def main():
	url = 'https://www.douban.com/search?q=' + str(MoviesName)
   try:
       print("正在连接中...")
       data = requests.get(url, headers=headers, proxies=proxy_temp).text
       #将获取的数据写道到csv文件中,调用write1()函数进行写入
       write1(EnName,MoviesName,Plot)
       #将操作使用过的MoviesName写入缓冲区,作为该行数据已处理过的记录
       write_redis(MoviesName)
   except:
       #程序连接失败,执行异常处理,将无法连接的数据写入到另一个csv文件中作为记录
       print("该电影名无法得到剧情数据...")
       write2(EnName,MoviesName)
       #将操作使用过的MoviesName写入缓冲区,作为该行数据已处理过的记录
       write_redis(MoviesName)

PS(该代码部分只贴入了部分代码,并不完整,主要用于体现try-except方法的使用)

1.2设置缓冲区

创建一个新的文件用来记录操作过的数据,在每次迭代执行主函数时,首先进行读取该文件,如果迭代获取的数据在该文件中,则跳过主函数的执行,如若不在其中,则证明该行数据没有被执行使用过,则调用主函数拿到该数据的相关数据信息。

def write_redis():
     with open('new_redis.txt', 'a', newline='', encoding='utf-8') as f:
        f.write(MoviesName)
        f.write('\n')

def main():
    df = pd.read_csv('All_Movie_1.10.csv',encoding='utf-8',sep=',',engine='python')
    for i in df.index:
        row = df.loc[i]
        MoviesName = row['MoviesName']
        EnName = row['EnName']
        with open ('new_redis.txt','r',encoding='utf-8') as f:
            #读取该txt文件,返回对象给data
            data = f.readlines()
            #如果该条数据MoviesName不在该对象中,则执行主函数
            if MoviesName not in data:
                main(MoviesName,EnName)

该方法可成功避免程序因为各种原因导致中断,而需要重新爬取批量数据的操作。如果程序中断,依然可以继续运行代码,同时继续在CSV文件后追加新的数据,而避免重复项的存入。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值