在进行英文取名项目对数据的爬取与分析中,经常会对已经存储的批量数据去获取更多有效的数据,这个时候我们需要考虑去重复问题,以及在高频率访问网站导致连接超时中断等问题。
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文件后追加新的数据,而避免重复项的存入。