Python数据库 -- 查询结果处理SQL表内数据去重

Posted _天涯__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据库 -- 查询结果处理SQL表内数据去重相关的知识,希望对你有一定的参考价值。

目录

需求

Python脚本查询数据库及返回结果的处理 

MySQL表内既有数据的去重思想及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) 查询,查询排名,表内一个人多条数据,查出最大的那条排名,请问!

不知道数据在sql server哪一个表内,如何查询。

连接两表查询结果的SQL语句

SQL server 2008R2中怎么直接修改表内数据

sql server 2005实现树形菜单显示的数据库表怎么设计?

查询同一表内多字段同时重复记录的SQL语句