python爬取静态数据并存入数据库
连接mysql数据库
导入pymysql,连接数据库
在mysql中创建数据表
create table hw_info(
id varchar(20) primary key ,
music_num varchar(20),
person_num varchar(20),
person_name varchar(20),
feel varchar(20),
music_url varchar(100)
)
import pymysql
db = pymysql.connect('ip','QINYUYOU','密码','homework')
cursor = db.cursor()
print('连接成功')
爬取数据
我们爬取的网站为:网站地址
需要爬取序号,音频编号,专家ID,专家名字,情感状态,音频地址。
f12查看headers
找到cookie和user-Agent,设置headers
headers = {
'cookie':'PHPSESSID=c704263b13bb6f919e7534be3690a04f',
'user-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
get请求网站
r = requests.get(url,headers=headers)
BeautifulSoup解析
r_b = BeautifulSoup(r.text,'lxml')
f12检查html源码,找到要爬取内容的信息
找到爬取信息的html标签,通过find_all方法定位到标签位置,获取标签内容
序号、音频、专家id和专家名字在同一个列表中,它们的字符串结构不同,不用正则表达式的话无法统一将信息提取出来,我只能一一对它们进行处理
for j in range(len(ob[i].find_all('b'))):
if j == 0 :
a = str(ob[i].find_all('b')[j].string)[3:]
print('序号为:'+str(ob[i].find_all('b')[j].string)[3:])#获取序号
if j == 1 :
b = str(ob[i].find_all('b')[j].string)[5:-1]
print('音频编号为:'+str(ob[i].find_all('b')[j].string)[5:-1])#获取音频编号
if j == 2 :
c = str(ob[i].find_all('b')[j].string)[5:]
print('专家id是:'+str(ob[i].find_all('b')[j].string)[5:])#获取专家id
if j == 3 :
d = str(ob[i].find_all('b')[j].string)[5:]
print('专家名字是:' + str(ob[i].find_all('b')[j].string)[5:])# 获取专家名字
之后获取情感状态
看了情感状态的html结构,表单属性selected缩写,不知道怎么获取这个option标签,写了一个方法,对这几个option标签列表,判断selected是否属于这个option对象,属于就将这个option对象作为列表的输出
def get_option(list_):
for i in list_:
if 'selected' in str(i):
return i
e = str(get_option(fea[i].find_all('option')).string)
print('情感状态是:'+str(get_option(fea[i].find_all('option')).string))#获取情感状态
最后还差一个音频地址,查看它的html结构
可以直接通过find找到他的audio标签,attrs获取标签属性值
f = str(movie_url[i].attrs['src'])
print('音频地址为:'+movie_url[i].attrs['src'])#获取音频地址
将数据传入数据库
select * from hw_info
sql = 'INSERT INTO hw_info(id,music_num,person_num,person_name,feel,music_url) VALUES(%s,%s,%s,%s,%s,%s)'
cursor.execute(sql,(a,b,c,d,e,f))
print('插入成功')
db.commit()
在数据库中查看数据
整体代码
import requests
from bs4 import BeautifulSoup
import re
import pymysql
db = pymysql.connect('139.155.71.69','QINYUYOU','QINyuyou5821661!','homework')
cursor = db.cursor()
print('连接成功')
def get_option(list_):
for i in list_:
if 'selected' in str(i):
return i
url = 'http://47.104.173.82/neu_emotion/Home/index/showPartData.html'
headers = {
'cookie':'PHPSESSID=c704263b13bb6f919e7534be3690a04f',
'user-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
r = requests.get(url,headers=headers)
r_b = BeautifulSoup(r.text,'lxml')
ob = r_b.find_all('tr',class_='text-center')#获取序号,音频编号,专家id,专家名字列表
fea = r_b.find_all('select',class_='form-control')#获取全部情感状态列表
movie_url = r_b.find_all('audio',class_='audio')#获取全部音频地址列表
for i in range(len(ob)):
for j in range(len(ob[i].find_all('b'))):
if j == 0 :
a = str(ob[i].find_all('b')[j].string)[3:]
print('序号为:'+str(ob[i].find_all('b')[j].string)[3:])#获取序号
if j == 1 :
b = str(ob[i].find_all('b')[j].string)[5:-1]
print('音频编号为:'+str(ob[i].find_all('b')[j].string)[5:-1])#获取音频编号
if j == 2 :
c = str(ob[i].find_all('b')[j].string)[5:]
print('专家id是:'+str(ob[i].find_all('b')[j].string)[5:])#获取专家id
if j == 3 :
d = str(ob[i].find_all('b')[j].string)[5:]
print('专家名字是:' + str(ob[i].find_all('b')[j].string)[5:])# 获取专家名字
e = str(get_option(fea[i].find_all('option')).string)
print('情感状态是:'+str(get_option(fea[i].find_all('option')).string))#获取情感状态
f = str(movie_url[i].attrs['src'])
print('音频地址为:'+movie_url[i].attrs['src'])#获取音频地址
sql = 'INSERT INTO hw_info(id,music_num,person_num,person_name,feel,music_url) VALUES(%s,%s,%s,%s,%s,%s)'
cursor.execute(sql,(a,b,c,d,e,f))
print('插入成功')
db.commit()
db.close()
后期更改
我研究了一下,对于获取情感状态的方法不是很好,BeautifulSoup有更好的做法
find()方法而已传入一个方法作为参数,这个方法如果用来判断标签是否存在某些属性,则find()方法会返回有这个属性的标签对象,代码如下
#判断标签tag是否包含selected属性,包含则返回true,否则返回false
def has_selected(tag):
return tag.has_attr('selected')
e = str(fea[i].find(has_selected).string)
#将has_selected方法传入find中,如果fea[i]标签中有selected属性,则返回包含selected属性的标签
print('情感状态是:'+str(fea[i].find(has_selected).string))#获取情感状态
最后整个代码变成这样
import requests
from bs4 import BeautifulSoup
import re
def has_selected(tag):
return tag.has_attr('selected')
def get_option(list_):
for i in list_:
if 'selected' in str(i):
return i
url = 'http://47.104.173.82/neu_emotion/Home/index/showPartData.html'
headers = {
'cookie':'PHPSESSID=c704263b13bb6f919e7534be3690a04f',
'user-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
}
r = requests.get(url,headers=headers)
r_b = BeautifulSoup(r.text,'lxml')
ob = r_b.find_all('tr',class_='text-center')#获取序号,音频编号,专家id,专家名字列表
fea = r_b.find_all('select',class_='form-control')#获取全部情感状态列表
movie_url = r_b.find_all('audio',class_='audio')#获取全部音频地址列表
for i in range(len(ob)):
for j in range(len(ob[i].find_all('b'))):
if j == 0 :
a = str(ob[i].find_all('b')[j].string)[3:]
print('序号为:'+str(ob[i].find_all('b')[j].string)[3:])#获取序号
if j == 1 :
b = str(ob[i].find_all('b')[j].string)[5:-1]
print('音频编号为:'+str(ob[i].find_all('b')[j].string)[5:-1])#获取音频编号
if j == 2 :
c = str(ob[i].find_all('b')[j].string)[5:]
print('专家id是:'+str(ob[i].find_all('b')[j].string)[5:])#获取专家id
if j == 3 :
d = str(ob[i].find_all('b')[j].string)[5:]
print('专家名字是:' + str(ob[i].find_all('b')[j].string)[5:])# 获取专家名字
e = str(fea[i].find(has_selected).string)
print('情感状态是:'+str(fea[i].find(has_selected).string))#获取情感状态
f = str(movie_url[i].attrs['src'])
print('音频地址为:'+movie_url[i].attrs['src'])#获取音频地址
测试代码就不加入数据库模块了,坚持学习,加油!!!