python 爬虫 爬取b站视频排行 并保存到mysql数据库

# @Time: 2021/7/14 17:49
# @File : main.py
import datetime
import time
import requests
from lxml import etree
import pymysql
from pymysql.err import Error
time_today = time.strftime("%Y-%m-%d", time.localtime())  # 本地时间
month = datetime.datetime.now().month  # 获取当前月份
# print('month' + str(type(month)))
year_month = str(datetime.datetime.now().year) + '-' + str(month) + '月'
table_name = str(year_month.replace('-', '_')) + 'b站热播视频排行数据'
# print(table_name)
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='jundb')
for i in range(1, 13):
    # print(type(i))
    if i == month:
        cursor = db.cursor()
        sql = 'CREATE TABLE IF NOT EXISTS %s (视频标题 VARCHAR(255) NOT NULL , 视频链接 CHAR(255) NOT NULL ,UP VARCHAR(255) NOT NULL , ' \
              '评论数 VARCHAR(25) NOT  NULL , 播放量 VARCHAR(25) NOT NULL ,排名 int(10) NOT NULL, PRIMARY KEY(排名))' % (table_name)
        cursor.execute(sql)
    elif i > month:
        pass
    else:
        pass
class main():
    # 定义一个爬取网页请求
    def load_page(self):
        url = 'https://www.bilibili.com/v/popular/rank/all'
        headers = {
            'user-agent': ''
            }
        html=requests.get(url,headers=headers).content.decode('utf-8')
        html = html.replace("\\n", " ")
        html = etree.HTML(html)
        node_list = html.xpath('/html/body/div[3]/div[2]/div[2]/ul/li')
        items={}
        for i in node_list:
            items["视频标题"] = i.xpath('./div[2]/div[2]/a/text()')
            items["视频链接"] = i.xpath('./div[2]/div[2]/a/@href')
            items["UP"] = i.xpath('./div[2]/div[2]/div[1]/a/span/text()')
            items["评论数"] = i.xpath('./div[2]/div[2]/div[1]/span[2]/text()')
            items["播放量"] = i.xpath('./div[2]/div[2]/div[1]/span[1]/text()')
            items["排名"] = i.xpath('./div[1]/text()')
            items_end = repr(str(items)).replace(" ", "").replace("\\\\n", "")
            self.save_file(items)
            print(items_end)
    def save_file(self, items):
        print("[INFO]开始保存到本地")
        file = open('D:\\bilibili.csv', 'a', encoding='UTF-8')
        file.write(repr(str(items)).replace(" ","").replace("\\\\n","")+"\n")
        file.close()
        print("[INFO]保存到本地成功")
        self.save_to_mysql(items)
    def save_to_mysql(self,items):
        print("[INFO]开始保存到MySQL")
        table = table_name
        keys = ','.join(items.keys())  # 键
        values = ','.join(['%s'] * len(items))  # 值
        sql1 = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE '.format(table=table, keys=keys,
                                                                                               values=values)  # 通过 ON DUPLICATE KEY UPDATE找出相同的键,然后更新
        updata = ','.join([" {key} = %s ".format(key=key) for key in items])
        sql1 += updata
        try:
            if cursor.execute(sql1, tuple(items.values()) * 2):
                print('[INFO]插入MySQL成功')
                db.commit()  # 插入
        except Error as e:
            print(e)
            print('Failed')
            db.rollback()  # 回滚
if __name__ == '__main__':
    spider = main()
    spider.load_page()


保存到数据库遇到单位为中文的情况 才疏学浅查了许多资料

json.loads()报错问题 :暂未知悉

from lxml import etree
html = etree.HTML(html) 
得以解决

可以用

UPDATE tb_name set `fb`=REPLACE(`fb`,'.'
,'');进行替换
 

以下是爬取豆瓣音乐 top250 并将数据存储到 MySQL 数据库中的完整代码: ```python import requests from bs4 import BeautifulSoup import pymysql # MySQL数据库连接信息 HOST = 'localhost' PORT = 3306 USERNAME = 'your_username' PASSWORD = 'your_password' DATABASE = 'your_database_name' # 连接MySQL数据库 db = pymysql.connect(host=HOST, port=PORT, user=USERNAME, password=PASSWORD, database=DATABASE, charset='utf8') cursor = db.cursor() # 创建数据表 sql = '''CREATE TABLE IF NOT EXISTS music_top250 ( id INT(10) NOT NULL AUTO_INCREMENT, title VARCHAR(100) NOT NULL, artist VARCHAR(100) NOT NULL, score FLOAT NOT NULL, PRIMARY KEY (id) )''' cursor.execute(sql) # 爬取数据 url = 'https://music.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('tr', class_='item') # 将数据存储到数据库中 for item in items: title = item.find('div', class_='pl2').a['title'] artist = item.find('div', class_='pl2').p.text.strip().split('/')[0] score = item.find('span', class_='rating_nums').text sql = "INSERT INTO music_top250 (title, artist, score) VALUES ('{}', '{}', {})".format(title, artist, score) cursor.execute(sql) db.commit() # 关闭数据库连接 db.close() ``` 说明: 1. 首先需要根据自己的 MySQL 数据库连接信息修改 HOST、PORT、USERNAME、PASSWORD 和 DATABASE 变量的值。 2. 执行 CREATE TABLE 语句创建数据表 music_top250,该数据表包含 id、title、artist 和 score 四个字段。 3. 使用 requests 库和 BeautifulSoup 库爬取豆瓣音乐 top250 页面,使用 find_all 方法获取每个音乐条目(tr 标签)。 4. 对于每个音乐条目,使用 find 方法获取音乐名称(title 标签)、艺术家名称(p 标签)和评分(span 标签)信息,将这些信息插入到 MySQL 数据库中。 5. 最后关闭数据库连接。 需要注意的是,如果要多次运行该代码,需要先删除数据表 music_top250 中的所有数据,否则会出现数据重复的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值