当前位置:AIGC资讯 > 数据采集 > 正文

python 爬虫及数据可视化展示

python 爬虫及数据可视化展示

学了有关python爬虫及数据可视化的知识,想着做一些总结,加强自己的学习成果,也能给各位小伙伴一些小小的启发。

1、做任何事情都要明确自己的目的,想要做什么,打算怎么做,做到什么样的程度,自己有一个清晰的定位,虽然计划永远赶不上变化,但是按计划走,见招拆招或许也是不错的选择。

2、本项目是爬取豆瓣的250部电影,将电影名,电影链接,评分等信息爬取保存到本地。将相关信息以列表的形式展示在网页上,访问者可通我的网站直接挑转到豆瓣查看电影,将评分制作评分走势图,将电影制作成词云图在网页上展示,共有五个网页,可相互跳转。

项目流程图:

数据爬取:

# -*- codeing = utf-8 -*-
# @Time : 2022/1/11 22:39
# @Author : lj
# @File : spider.PY
# @Software: 4{PRODUCT_NAME}
import bs4  # 网页解析,获取数据 对网页的数据进行拆分
import re   #正则表达式,进行文字匹配   对数据进行提炼
import urllib.request,urllib.error  #指定url 获取网页数据 怕网页
import xlwt  #进行excel 操作  存再excel中
import sqlite3 #进行sqllite 数据库操作 存在数据库中
import time
# 主函数
def main():
    # 调用函数
    url = "https://movie.douban.com/top250?start="
    datalist1 = allData(url)
    # savepath = "豆瓣电影top250.xls"
    # savedata(datalist1,savepath)
    dbpath = "move.db"
    savedatasql(datalist1,dbpath)
#匹配所需内容的正则表达式
linkpattern = re.compile(r'<a href="https://blog.csdn.net/m0_54861649/article/details/(.*?)/">')
#匹配图片的正则表达式
imagepattern = re.compile(r'<img .*src="https://blog.csdn.net/m0_54861649/article/details/.*"/>',re.S)#re.S 忽略换行符,.表示除了换行符以外的所有字符
#匹配影名的正则表达式
namepattern = re.compile(r'<span class="title">(.*)</span>')
# 影片评分
gradepattern = re.compile(r'<span   property="v:average">(.*)</span>')
# 评价人数
peoplepattern = re.compile(r'<span>(d*)人评价</span>')#(d*) 零个或多个
#概况
thinkpattern = re.compile(r'<span class="inq">(.*)</span>')
#影片的相关内容
contentpattern = re.compile(r'<p class="">(.*?)</p>',re.S)#忽略换行符

#1、爬取一个网页
def getData(url1):
    head = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"}
    request = urllib.request.Request(url1,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html  #返回给调用的地方
# 2、爬取所有网页,匹配分析
def allData(url):
    datalist = []
    for i in range(0, 10):  # 左闭右开 调用十次,每次二十五条信息
        url1 = url + str(i * 25)
        html = getData(url1) #保存获取到的网页源码
        time.sleep(1)
        # 逐页解析
        soup = bs4.BeautifulSoup(html,"html.parser") #返回树型结构
        for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,返回列表,class加下划线
            data = []
            item = str(item)
            #link 获取到影片的超链接
            link = re.findall(linkpattern,item)[0]
            data.append(link)
            # 影片图片
            image = re.findall(imagepattern,item)[0]
            data.append(image)
            # 影片名
            name = re.findall(namepattern,item)
            if(len(name)==2):
                chinaname = name[0]
                data.append(chinaname)
                outername = name[1].replace("/","")#.replace("/","") 列表内置的方法,将/替换为空""
                data.append(outername)
            else:
                data.append(name[0])
                data.append('  ')#外文名空出来
            # 影片评分
            grade = re.findall(gradepattern,item)[0]
            data.append(grade)
            # 影片评价人数
            people = re.findall(peoplepattern, item)[0]
            data.append(people)
            # 影片概况
            think = re.findall(thinkpattern, item)
            if len(think) != 0:
                think = think[0].replace("。","")
                data.append(think)
            else:
                data.append("  ")
            # 影片内容
            content = re.findall(contentpattern, item)[0]
            content = re.sub('<br(s+)?/>(s+)?'," ",content)#替换内容中多余的符号和内容
            content = re.sub('/'," ",content)
            data.append(content.strip())#去除列表中的空格
            datalist.append(data)
    return datalist
#3、保存数据到excel
# def savedata(datalist1,savepath):
#     workplace = xlwt.Workbook(encoding="utf-8",style_compression=0)#style_compression=0·压缩样式
#     worksheet = workplace.add_sheet("豆瓣电影top250",cell_overwrite_ok="true")#cell_overwrite_ok=true 是否可以覆盖
#     col = ('电影详情链接','电影图片链接','影片中文名','影片外文名','评分','评价人数','概况','影片内容')
#     for i in range(0,8):
#         worksheet.write(0,i,col[i])
#     for i in range(0,250):
#         print("打印了%d条" %(i+1))
#         databuffer = datalist1[i]
#         for j in range(

更新时间 2023-11-08