欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬取静态数据并存入数据库

程序员文章站 2022-05-03 11:54:09
...

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('连接成功')

爬取数据

我们爬取的网站为:网站地址
python爬取静态数据并存入数据库
需要爬取序号,音频编号,专家ID,专家名字,情感状态,音频地址。
f12查看headers
python爬取静态数据并存入数据库
找到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源码,找到要爬取内容的信息
python爬取静态数据并存入数据库
找到爬取信息的html标签,通过find_all方法定位到标签位置,获取标签内容
python爬取静态数据并存入数据库
序号、音频、专家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:])# 获取专家名字

之后获取情感状态
python爬取静态数据并存入数据库
看了情感状态的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结构
python爬取静态数据并存入数据库
可以直接通过find找到他的audio标签,attrs获取标签属性值

        f = str(movie_url[i].attrs['src'])
        print('音频地址为:'+movie_url[i].attrs['src'])#获取音频地址

将数据传入数据库

select * from hw_info

python爬取静态数据并存入数据库

        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'])#获取音频地址

测试代码就不加入数据库模块了,坚持学习,加油!!!