# 连接数据库“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('上海交大')]