Python数据库 -- 查询结果处理SQL表内数据去重
Posted _天涯__
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据库 -- 查询结果处理SQL表内数据去重相关的知识,希望对你有一定的参考价值。
目录
需求
每次在爬动态的时候都会把前几条重复爬取,以前想着先把功能完善了再说。终于,功能做完了,要面对这个数据问题了。
想法是先看看领英的帖子是否有跟脸书一样的独特标志,可以用做识别的,但是检查元素后发现没有,那就只能对比内容来做重复识别了。
那么接下来的步骤很简单,也很低效率,每次先从数据库中读出所有的 content 列的内容,存到一个列表中,再检测每篇文章的内容,若已存在,就跳过这篇文章不再爬取。
方法成功执行,数据不再高度冗余。
后期预计加入检测评论数和点赞数的变化,来判断是否更新这条记录,更新预计使用update语句。
Python脚本查询数据库及返回结果的处理
Python查询mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
有一点要注意,从数据库中查询返回的结果列表,里面的元素并不是字符串类型,而且格式也多了括号和逗号,需要特殊处理再进行比较操作。
(!!!重要!!!2021-02-06 20:18补充)使用Python从数据库中cur.execute(sql_select)以及cur.fetchall()查询到的结果集合,数据类型为tuple即元组类型,不能进行append操作,需要先强制类型转换,list1=list(tuple1)。在列表中的元素也不是数据库中看到的,开头会多出 (' ,结尾会多出 ',) ,所以要截取一下,比如str1=str1[2:len(str1)-3]。
sql_select = 'select url from rurls;'
cur.execute(sql_select)
tuple1 = cur.fetchall() # 获取结果元组
list1 = list(tuple1) # 元组强制转换为list
str1 = str(list1[0]) # 强制转换list中的元素为str
str1 = str1[2:len(str1) - 3] # 字符串截取
首先强制类型转换为str,然后取子串比较。
# 读取数据库
sql_select = "select substring(content,1,10) from linkedin_blog where uname = '%s'" % uname
allc = []
try:
cur.execute(sql_select)
allc = cur.fetchall()
print('数据库内容读取成功')
except Exception as e:
print("数据库内容读取失败")
# 爬取当前文章的content
# 检测
c2t = content[0:10]
for ac in allc:
a2t = str(ac)[2:12] # 这里注意特殊处理
if c2t == a2t:
ifexist = 1
break
# 真正的爬取
if ifexist == 0:
# 进行全文信息爬取
MySQL表内既有数据的去重思想及SQL语句
大致思想是:
1、查询出——某个不可能重复的字段(比如 url )的重复值即 count>1 的 url 值
2、以及——url 字段有重复即count>1数据的最小自增 auto_id 值
3、执行删除
delete
from urls
where
url in (select durl from (select url as durl from urls group by url having count(url)>1) a)
and
auto_id not in (select did from (select min(auto_id) as did from urls group by url having count(url)>1 ) b)
数据库表是这样的:
SQL语句层次:
附重置本地数据库表的自增id(也会清空表内数据)的方法:
1、进入MySQL客户端。
2、切换数据库。
3、运行 truncate table your_table_name; 即可
以上是关于Python数据库 -- 查询结果处理SQL表内数据去重的主要内容,如果未能解决你的问题,请参考以下文章
SQL(MySQL + PHP) 查询,查询排名,表内一个人多条数据,查出最大的那条排名,请问!