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:
    # 进行全文信息爬取

Python数据库 -- 查询结果处理、SQL表内数据去重_第1张图片  Python数据库 -- 查询结果处理、SQL表内数据去重_第2张图片  Python数据库 -- 查询结果处理、SQL表内数据去重_第3张图片

 

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)

数据库表是这样的:  

 Python数据库 -- 查询结果处理、SQL表内数据去重_第4张图片

SQL语句层次: 

Python数据库 -- 查询结果处理、SQL表内数据去重_第5张图片

附重置本地数据库表的自增id(也会清空表内数据)的方法:

1、进入MySQL客户端。

2、切换数据库。

3、运行   truncate table your_table_name;   即可

 

Python数据库 -- 查询结果处理、SQL表内数据去重_第6张图片

你可能感兴趣的:(Debug记录,编程小技巧,数据库,python,mysql,数据分析,数据库)