首页 > 其他分享 >42爬取数据并保存至db

42爬取数据并保存至db

时间:2022-12-23 11:47:47浏览次数:34  
标签:db 42 actor replace 爬取 movie print txt

需求:

将爬取数据保存到数据库

将爬取数据保存为txt文件

将txt文件内容生成为词云

查看爬取到数据库的数据信息

代码如下:

import os.path
import requests
import pymysql
import parsel
import csv  #保存csv文件
import imageio
import jieba    #引用中文分词库
from wordcloud import WordCloud #引用词云库

#获取网页源代码、解析数据
def get_html():
    films = [] #用来存储全部数据
    num = 1
    for page in range(0, 250, 25):
        print(f'正在爬取第{num}页数据内容')
        num += 1
        url = f"https://movie.douban.com/top250?start={page}&filter="
        # user-agent 浏览器基本标识 基本信息 headers请求头 主要把python代码进行伪装
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36'
        }
        response = requests.get(url=url, headers=headers)
        # 2、获取数据
        #return response.text
        # 3、解析数据
        selector = parsel.Selector(response.text)
        lis = selector.css('.grid_view li')
        for li in lis:
            title = li.css('.info .hd span.title:nth-child(1)::text').get()  # 电影名
            movie_info_list = li.css('.bd p:nth-child(1)::text').getall()
            actor_list = movie_info_list[0].strip().split('   ')
            if len(actor_list) > 1:
                actor_1 = actor_list[0].replace('导演', '').replace(':', '')  # 导演
                actor_2 = actor_list[1].replace('主演', '').replace('/...', '').replace(':', '').replace("'", "")  # 主演
            else:
                actor_1 = actor_list[0]
                actor_2 = 'None'
            movie_info = movie_info_list[1].strip().split(' / ')  # movie_info_list[1]:取的是拍摄国家,年份和剧情三个信息
            movie_year = movie_info[0]  # 电影年份
            movie_country = movie_info[1]  # 拍摄国家
            movie_type = movie_info[2]  # 电影类型
            sum = li.css('.star span:nth-child(4)::text').get().replace('人评价', '')
            dit = {"title":title, "actor_1":actor_1, "actor_2":actor_2, "movie_year":movie_year,  "movie_country":movie_country, "movie_type":movie_type, "sum":sum}
            films.append(dit) #将处理好的一步电影存入列表
    return films

#保存到数据库
def save_db():
    data = get_html()
    # db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='python1', charset='utf8')
    db = pymysql.connect(host="xxxxx",port=3306, user="root", password="666", db="pythonTest",charset='utf8')
    cursor = db.cursor()  # 游标 能获得连接的游标,这个游标可以用来执行SQL查询
    for i in range(len(data)):
        sql = "insert into movie(title,director,actor,movie_year,movie_country,movie_type,num)values('%s','%s','%s','%s','%s','%s','%s')" % (
            data[i]["title"],data[i]["actor_1"],data[i]["actor_2"],data[i]["movie_year"],data[i]["movie_country"],data[i]["movie_type"],
            data[i]["sum"])
        cursor.execute(sql)  # 执行sql语句
        db.commit()  # 提交至数据库
    print("存储数据库完毕")
    # 关闭光标对象
    cursor.close()
    # 关闭连接
    db.close()

#保存为txt文件
def save_txt():
    f = open('豆瓣Top250.txt', mode='w', encoding='utf-8', newline='')
    csv_write = csv.DictWriter(f, fieldnames=[
        '标题',
        '导演',
        '演员',
        '电影年份',
        '拍摄国家',
        '电影类型',
        '评价人数'
    ])
    csv_write.writeheader()  # 写入表头
    data = get_html()
    for i in range(len(data)):
        s = str(data[i]).replace('{', '').replace('}', '').replace("'", '').replace(':', '').replace('title','')\
                .replace('actor_1','').replace('actor_2','').replace('movie_year','').replace('movie_country','')\
               .replace('movie_type','').replace('sum','') + '\n'
        f.write(s)
    f.close()
    print("数据成功存入文件:豆瓣Top250.txt")

#词云
def wordcloud():
    mask = imageio.imread("f.png")
    if os.path.isfile("豆瓣Top250.txt"):
        f = open('豆瓣Top250.txt', 'r', encoding='utf-8')  # 打开文件
        ls = f.read()  # 读文件,并将字符串放到 ls变量中
        f.close()  # 关闭文件
        l = jieba.lcut(ls)  # 利用jieba库中 全模式中文分词样式,生成l列表
        txt = " ".join(l)  # 将列表l 数据间加空格,再赋值给 txt 字符串
        wordcloud = WordCloud(background_color="pink",
                              width=800,
                              height=600,
                              max_words=10000,
                              max_font_size=80,
                              min_font_size=1,
                              mask=mask,  # 指定词云形状,默认为长方形
                              # contour_width=1,    #轮廓宽度
                              # contour_color='steelblue',  #轮廓颜色
                              font_path="simkai.ttf",
                              # scale=5
                              ).generate(txt)  # 向WordCloud对象wordcloud中加载文本txt生成词云
        wordcloud.to_file('ball1_词云图.png')  # 将词云输出为图像文件
        print("词云成功生成")
    else:
        print("文件:豆瓣Top250.txt不存在,可先执行功能序号为2的功能创建txt文件")
#查询数据库
def finddb():
    # db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='python1', charset='utf8')
    db = pymysql.connect(host="xxxxx",port=3306, user="root", password="666", db="pythonTest",charset='utf8')#存储服务器
    cursor = db.cursor()#游标 能获得连接的游标,这个游标可以用来执行SQL查询
    #游标是一种数据访问对象,可用于在表中迭代一组行或者向表中插入新行。
    sql = "select * from movie"
    cursor.execute(sql)#执行sql语句
    data = cursor.fetchall()#查询数据库全部数据
    if len(data) !=0:
        print("豆瓣电影Top250")
        print("--------------------------------------------")
        for i in data:
            print("排名:", i[0])
            print("电影名:", i[1])
            print("导演:", i[2])
            print("主演:", i[3])
            print("拍摄年份:", i[4])
            print("拍摄国家:", i[5])
            print("剧情:", i[6])
            print("评论人数:", i[7])
            print("===================================")
    else:
            print("数据库为空,可先执行功能序号1的功能")
    # 关闭光标对象
    cursor.close()
    # 关闭连接
    db.close()


#主函数入口
if __name__ == '__main__':
    while True:
        print("===================================")
        print('请选择功能序号:')
        print("   1.将爬取数据保存到数据库")
        print("   2.将爬取数据保存为txt文件")
        print("   3.将txt文件内容生成为词云")
        print("   4.查看爬取到数据库的数据信息")
        print("   5.退出")
        print("===================================")
        num = input('请输入功能序号:')
        if num == '1':
            save_db()
            continue
        elif num == '2':
            save_txt()
            continue
        elif num == '3':
            wordcloud()
        elif num == '4':
            finddb()
        elif num == '5':
            exit()
        else:
            print("序号输入错误,请重新输入")

简要效果图如下:

标签:db,42,actor,replace,爬取,movie,print,txt
From: https://www.cnblogs.com/socoo-/p/17000312.html

相关文章

  • Python网络爬虫——爬取和分析福建二手房房价及各项数据
    一、 选题的背景介绍随着越来越多城市的房地产市场进入存量时代,二手房市场的地位愈发重要,其走势对于房地产整体市场的影响也逐渐加强。在很多二手房市场规模占比较高的一......
  • GDB完全手册(转载)
    文章来是网上的转载,GDB完全手册 https://blog.csdn.net/cwchenwu88/article/details/6793008GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢......
  • AcDbObjectPointerBase
    AcDbObjectPointerBase是一组模板类的基类,这些模板类简化了AcDbObjects指针的内存管理以及打开和关闭AcDbObjects。这些类提供了在创建和销毁时自动打开和关闭AcDbObjects......
  • lightdb数据库链接之postgresql_fdw
    FDW简介FDW(ForeignDataWrapper)是lightdb的一个插件。通过FDW,可以将远程pg数据库映射到本地(映射为server),将远程数据库table映射为本地的foreigntable。通过FDW......
  • 联合早报新闻数据爬取与可视化分析
    联合早报新闻数据爬取与可视化分析 一. 选题背景在现今随着互联网的发展,时刻流通的信息变得更加庞大而繁杂,获取信息,整合提取有实际效益的信息成为了一个难题。......
  • AcWing342. 道路与航线
    原题链接解题思路这题用\(SPFA\)会被卡,所以我们不能用\(SPFA\)但是观察数据我们可以发现对于道路,\(0≤C_i≤10^{5}\)所以对于每个连通块(内部不存在航线),我们可以用\(Di......
  • MongoDB从入门到实战之MongoDB快速入门
    前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念,带领大家快速入门MongoDB这个文档型的NoSQL数据库。Mongo......
  • 网易云热门音乐评论爬取+大数据分析+数据可视化
    一、选题的背景声乐艺术的情感,是歌唱者在自己内心唤起曾经的体验的情感,是一首歌曲的灵魂,抒发情感,给人带来幸福感满足感是音乐的魅力所在。只有加入情感的表现才能使演......
  • 爬虫1 认识和基本爬取UA伪装
    robots.txt协议君子协议如果爬取了robots.txt不允许被爬的东西,会封你IP,你还可以进局子。可以在网站根目录下加上访问看下存在不,大网站一般是存在的。百度翻译[练练手......
  • python爬虫-美团海底捞评论及评分数据爬取和分析
    美团海底捞评论及评分数据爬取和分析一、选题背景  通过网络请求的方式获取响应数据,再对获取的数据进行分析提取和汇总,并储存到xlsx表格中。在进入互联网存储海量数据......