# 连接数据库“pachong”
import pymysql
db = pymysql.connect(host='localhost',port=3306,user='root',password='',database='pachong',charset='utf8')
cur = db.cursor() #获取会话指针,并命名为cur,用来调用SQL语句,其中的db为前面创建的数据库连接
INSERT INTO `test`(`company`, `title`, `href`, `date`, `source`) VALUES ('阿里巴巴','标题2','链接2','日期2','来源2')
sql = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)'
cur.execute(sql,(company, title, href, date, source)) #执行SQL语句
db.commit() #固定写法
cur.close() #关闭会话指针
db.close() #关闭数据库连接
# 预定义变量
company = '阿里巴巴'
title = '测试标题'
href = '测试链接'
date = '测试日期'
source = '测试来源'
# 连接数据库
import pymysql
db = pymysql.connect(host='localhost',port=3306,user='root',password='',database='pachong',charset='utf8')
# 插入数据
cur = db.cursor() #获取会话指针,并命名为cur,用来调用SQL语句,其中的db为前面创建的数据库连接
sql = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)'
cur.execute(sql,(company, title, href, date, source)) #执行SQL语句
db.commit() #固定写法
cur.close() #关闭会话指针
db.close() #关闭数据库连接
sql = "INSERT INTO test (company, title, href, date, source) VALUES ('阿里巴巴','标题2','链接2','日期2','来源2')"
sql = "INSERT INTO test (company, title, href, date, source) VALUES ('阿里巴巴','标题2','链接2','日期2','来源2')"
import pymysql
db = pymysql.connect(host='localhost',port=3306,user='root',password='',database='pachong',charset='utf8')
company = '阿里巴巴'
cur = db.cursor() #获取会话指针,用来调用SQL语句
sql = 'SELECT * FROM test WHERE company = %s' #编写SQL语句
cur.execute(sql,company) #执行SQL语句
data = cur.fetchall() #提取查找到的所有数据,并赋给变量data
print(data) #打印输出data,查看提取结果
db.commit() #提交表单,这一行其实可以不写,因为程序没有修改数据表结构
cur.close() #关闭会话指针
db.close() #关闭数据库连接
for i in range(len(data)):
print(data[i][1])
sql = 'SELECT * FROM test WHERE company = %s AND title = %s'
cur.execute(sql,(company,title))
DELETE FROM `test` WHERE `company` = '百度'
cur = db.cursor() #获取会话指针,用来调用SQL语句
sql = 'DELETE FROM test WHERE company = %s' #编写SQL语句
cur.execute(sql,company) #执行SQL语句
import pymysql
db = pymysql.connect(host='localhost',port=3306,user='root',password='asdfg12345',database='pachong',charset='utf8')
company = '百度'
cur = db.cursor() #获取会话指针,用来调用SQL语句
sql = 'DELETE FROM test WHERE company = %s' #编写SQL语句
cur.execute(sql,company) #执行SQL语句
data = cur.fetchall() #提取查找到的所有数据,并赋给变量data
db.commit() #提交表单,这一行其实可以不写,因为程序没有修改数据表结构
cur.close() #关闭会话指针
db.close() #关闭数据库连接
# 1.获取网页源代码 import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'} def baidu(company): url = 'https://www.baidu.com/s?rtt=4&tn=news&wd=' + company res = requests.get(url,headers=headers).text #print(res) # 2.编写正则表达式提取和解析源代码 import re p_date = '(.*?)' p_source = '(.*?)' date = re.findall(p_date,res) source = re.findall(p_source,res) # print(date) # print(source) p_href = '
href = re.findall(p_href,res) #不存在换行,无须添加re.S #print(href) p_title = '
#用“.*?”代替不关心的内容,用“(.*?)”提取需要的内容 title=re.findall(p_title,res,re.S) #存在换行,需要添加re.S # print(title) # 3.数据清洗 for i in range(len(title)): title[i] = re.sub('<.*?>','',title[i]) print(str(i+1) + '.' + title[i] + '(' + source[i] + ' '+ date[i] + ')') print(href[i]) # 4.数据存储 import pymysql for i in range(len(title)): db = pymysql.connect(host='localhost',port=3306,user='root',password='',database='pachong',charset='utf8') cur = db.cursor() #获取会话指针,并命名为cur,用来调用SQL语句,其中的db为前面创建的数据库连接 sql = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)' cur.execute(sql,(company, title[i], href[i], date[i], source[i])) #执行SQL语句 db.commit() #固定写法 cur.close() #关闭会话指针 db.close() #关闭数据库连接
baidu('阿里巴巴')
第33~40行代码将爬取的数据插入数据表中,其中cur.execute()函数的参数company就是baidu()函数的参数company。这里先调用一次baidu()函数爬取“阿里巴巴”一家公司,并且不做异常处理,运行结果如下图所示。
先批量删除原有公司的数据:
# 删除
import pymysql
companies = ['阿里巴巴','华能信托']
for i in range(len(companies)):
company = companies[i]
db = pymysql.connect(host='localhost', port=3306, user='root', password='', database='pachong',
charset='utf8')
cur = db.cursor() #获取会话指针,用来调用SQL语句
sql = 'DELETE FROM test WHERE company = %s' #编写SQL语句
cur.execute(sql,company) #执行SQL语句
data = cur.fetchall() #提取查找到的所有数据,并赋给变量data
db.commit() #提交表单,这一行其实可以不写,因为程序没有修改数据表结构
cur.close() #关闭会话指针
db.close() #关闭数据库连接
# 爬取多家公司的数据并写入数据库
companies = ['华能信托','阿里巴巴','百度集团','腾讯','京东']
for company in companies:
try:
baidu(company)
print('爬取并写入数据库成功')
except:
print('爬取并写入数据库失败')
# 写入数据时进行去重处理
sql_1 = 'SELECT * FROM test WHERE company = %s' #按公司名称选取数据
cur.execute(sql_1,company) #执行SQL语句,选取公司名称为company的数据
data_all = cur.fetchall() #提取所有数据
title_all = [] #创建一个空列表用来存储新闻标题
for j in range(len(data_all)):
title_all.append(data_all[j][1]) # 将数据中的新闻标题存入列表
for j in data_all:
title_all.append(j[1])
if title[i] not in title_all:#判断列表中是否存在该新闻标题
sql_2 = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)'
cur.execute(sql_2,(company, title[i], href[i], date[i], source[i]))
db.commit()
# 去重处理的完整代码
for i in range(len(title)):
db = pymysql.connect(host='localhost',port=3306,user='root',password='asdfg12345',database='pachong',charset='utf8')
cur = db.cursor() #获取会话指针,并命名为cur,用来调用SQL语句,其中的db为前面创建的数据库连接
# 1.查询数据
sql_1 = 'SELECT * FROM test WHERE company = %s' #按公司名称选取数据
cur.execute(sql_1,company) #执行SQL语句,选取公司名称为company的数据
data_all = cur.fetchall() #提取所有数据
title_all = [] #创建一个空列表用来存储新闻标题
for j in range(len(data_all)):
title_all.append(data_all[j][1]) # 将数据中的新闻标题存入列表
# 2.判断新爬取到的数据是否已在数据库中,不在的话才将其写入
if title[i] not in title_all:#判断列表中是否存在该新闻标题
sql_2 = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)'
cur.execute(sql_2,(company, title[i], href[i], date[i], source[i]))
db.commit()
cur.close()
db.close()
# 去重处理实战的源代码 # 1.获取网页源代码 import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'} def baidu(company): url = 'https://www.baidu.com/s?rtt=4&tn=news&wd=' + company res = requests.get(url,headers=headers).text #print(res) # 2.编写正则表达式提取和解析源代码 import re p_date = '(.*?)' p_source = '(.*?)' date = re.findall(p_date,res) source = re.findall(p_source,res) # print(date) # print(source) p_href = '
href = re.findall(p_href,res) #不存在换行,无须添加re.S #print(href) p_title = '
#用“.*?”代替不关心的内容,用“(.*?)”提取需要的内容 title=re.findall(p_title,res,re.S) #存在换行,需要添加re.S # print(title) # 3.数据清洗 for i in range(len(title)): title[i] = re.sub('<.*?>','',title[i]) print(str(i+1) + '.' + title[i] + '(' + source[i] + ' '+ date[i] + ')') print(href[i]) # 4.数据存储 import pymysql for i in range(len(title)): db = pymysql.connect(host='localhost',port=3306,user='root',password='asdfg12345',database='pachong',charset='utf8') cur = db.cursor() #获取会话指针,并命名为cur,用来调用SQL语句,其中的db为前面创建的数据库连接 # (1).查询数据 sql_1 = 'SELECT * FROM test WHERE company = %s' #按公司名称选取数据 cur.execute(sql_1,company) #执行SQL语句,选取公司名称为company的数据 data_all = cur.fetchall() #提取所有数据 title_all = [] #创建一个空列表用来存储新闻标题 for j in range(len(data_all)): title_all.append(data_all[j][1]) # 将数据中的新闻标题存入列表 # (2).判断新爬取到的数据是否已在数据库中,不在的话才将其写入 if title[i] not in title_all:#判断列表中是否存在该新闻标题 sql_2 = 'INSERT INTO test (company, title, href, date, source) VALUES (%s,%s,%s,%s,%s)' cur.execute(sql_2,(company, title[i], href[i], date[i], source[i])) db.commit() cur.close() db.close()
# 爬取多家公司的数据并写入数据库
companies = ['华能信托','阿里巴巴','百度集团','腾讯','京东','中国平安']#新增了一家公司“中国平安”
for company in companies:
try:
baidu(company)
print('爬取并写入数据库成功')
except:
print('爬取并写入数据库失败')
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:@localhost:3306/pachong')
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:asdfg12345@localhost:3306/pachong')
sql = "SELECT * FROM test"
df = pd.read_sql_query(sql,engine)
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:asdfg12345@localhost:3306/pachong')
df = pd.read_excel('百度新闻-多家.xlsx')
df.to_sql('test',engine,index=False,if_exists='append')
df.to_sql('测试',engine,index=False,if_exists='append')
df = df.astype('str')
today = time.strftime('%Y-%m-%d')
sql = 'SELECT * FROM test WHERE 日期 = %(date)s'
df_old = pd.read_sql_query(sql,engine,params={'date':today})
df_new = df[~df['标题'].isin(df_old['标题'])]
df_new = df[df['标题'].isin(df_old['标题'])]
df_new = df[~df['标题'].isin(df_old['标题'])]
就表示选择df[‘标题’]列中独有的内容(也就是没有出现在df_old[‘标题’]列中的内容),这样便去除了df和df_old重复的内容。import pandas as pd
df = pd.DataFrame({'标题':['标题1','标题2'],'日期':['日期1','日期2']})
df_old = pd.DataFrame({'标题':['标题2','标题3'],'日期':['日期2','日期3']})
df_new = df[~df['标题'].isin(df_old['标题'])]
df_new = df.append(df_old) #也可以写成pd.concat([df,df_old])
df_new = df_new.drop_duplicates(keep=False) #数据去重,keep=False 表示删除所有重复行
df['列名'].str.contains(关键词)
df = pd.DataFrame({'标题':['华能信托好','上海交大好'],'日期':['日期1','日期2']})
df_new = df[df['标题'].str.contains('上海交大')]