豆瓣Top250:Python爬虫+数据可视化

前言

刚入门python,数据库,html,寻思着学点有意思的东西。就在无聊之时无意间在B站上看到了爬虫视频,本以为爬虫入门门槛很高。但是老师讲解清晰细腻,兴趣盎然。视频中还有很多基础讲解,非常适合入门爬虫的新手,几乎是零基础入门爬虫的绝佳体验。于是参考B站Python爬虫基础5天速成(2021全新合集)Python入门+数据可视化学习制作,经过大概一个周的练习思考,以下是我学习过程中的心得体会,由于整个项目太大,部分代码未做展示,完整项目已上传豆瓣Top250Python爬虫+数据可视化.zip。感兴趣或者有疑惑地小伙伴评论区见。

数据爬取

from bs4 import BeautifulSoup       # 网页解析,获取数据
import re                           # 正则表达式,进行文字匹配
import urllib.request as urlre      # 指定rul,获取网页数据
import xlwt                         # 操作Excel
import sqlite3                      # 操作数据库

测试类库

1.urllib.request( 获取网页HTML源代码)
import urllib.request

url = 'https://movie.douban.com/top250?start='
data = bytes(urllib.parse.urlencode({"":""}),encoding='utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36' 
}
# 获取网页HTML源代码
urllib.request.urlopen(urllib.request.Request(url=url,data=data,headers=headers,method='POST')).read().decode('utf-8')


# 获取一个get请求
response = urlre.urlopen('http://www.baidu.com')
# 获取网页源代码
print(response.read().decode('utf-8'))

# response = re.urlopen('http://www.baidu.com')
# 网页状态 200
# print(response.status)
# 当我们访问网页时浏览器会向服务器发送请求头,里面包含浏览器版本等信息
# 如果我们的爬虫用get方式直接访问就会被有反爬机制的服务器识破我们的身份
# 因此我们需要用post方式发送请求,使用代理重新设置headers,并且通过urllib.parse模拟用户登录
# print(response.getheaders())
# print(response.getheader('Server'))

# 超时处理
# try:
    # response = re.urlopen('https://httpbin.org/get',timeout=0.5)
    # print(response.read().decode('utf-8'))

# except Exception as e:
#     print(e)
# 获取一个post请求,模拟用户登录时使用
# import urllib.parse
# data = bytes(urllib.parse.urlencode({"":""}),encoding='utf-8')
# response = re.urlopen('https://httpbin.org/post',data=data)
# print(response.read().decode('utf-8'))

url = 'https://movie.douban.com/top250?start='
data = bytes(urllib.parse.urlencode({"":""}),encoding='utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36'

}
req = re.Request(url=url,data=data,headers=headers,method='POST')
response = re.urlopen(req)
print(response.read().decode('utf-8'))
2.re(匹配HTML源代码)
# m = re.compile('aa').search('cab')
# m = re.search('aa','dadaa')     # 前面是规则,后面是校验对象
# <re.Match object; span=(3, 5), match='aa'>

m = re.findall('[a-c]','dkcfjsabaefaf')  # 找到所有匹配的项
# ['c', 'a', 'a', 'a']

m = re.sub('a','A','asdfgdada')     # 找到a,用A替换
# AsdfgdAdA
3.bs4(HTML/XML的解析器)

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象被归纳为4种:

  • Tag 标签及其内容(查找第一个符合要求的标签)
    对于 Tag,它有两个重要的属性,是 name 和 attrs
  • NavigableString string 标签内容
  • BeautifulSoup 整个文档
  • Comment 一个特殊类型的 NavigableString 对象,输出的内容不包括注释符号
搜索文档树

find_all(name, attrs, recursive, text, *kwargs)

在上面的栗子中我们简单介绍了find_all的使用,接下来介绍一下find_all的更多用法-过滤器。这些过滤器贯穿整个搜索API,过滤器可以被用在tag的name中,节点的属性等。

  1. # 两者是相等的
  2. # t_list = bs.find_all("a") => t_list = bs("a")

传入参数:

  1. 字符串过滤:会查找与字符串完全匹配的内容

  2. 正则表达式过滤:如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容

  3. 列表:如果传入一个列表,BeautifulSoup4将会与列表中的任一元素匹配到的节点返回

  4. 方法:传入一个方法,根据方法来匹配

CSS选择器

BeautifulSoup支持发部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag

通过标签名查找

print(bs.select('title'))

属性查找

print(bs.select('a[class="bri"]'))

更多见beautifulsoup菜鸟教程

4.xlwt(解析出的数据保存到Excel)
import xlwt                         		# 操作Excel
workbook = xlwt.Workbook(encoding='utf-8')  # 创建Excel工作表
worksheet = workbook.add_sheet('sheet1')    # 创建工作簿
worksheet.write(0,0,'hello')                # 在工作簿第一行第一列设置数据
workbook.save('student.xlsx')               # 命名并保存工作表
5.sqlite3(解析出的数据保存到sqlite数据库)

conn = sqlite3.connect('db.sqlite3')   # 打开或创建数据库文件

cursor = conn.cursor()					# 创建游标

# sql = '''
#     create table company(
#         id int primary key not null,
#         name text not null,
#         age int not null,
#         address char(20),
#         salary real
#     );
# '''

# sql = '''
#     insert into company values(1,'张三',10,'重庆',8888);
# '''
result = cursor.execute('select * from company')

for i in result:
    print('id=',i[0])
    print('id=',i[1])
    print('id=',i[2])
    print('id=',i[3])

# result = cursor.fetchall()
# print(result)
# conn.commit()
cursor.close() 
conn.close()

执行流程

在这里插入图片描述

# 通过urllib.request解析一个指定url内容,返回网页HTML源码
def askUrl(url):
    headers = {     # 模拟浏览器头部信息,发送给豆瓣服务器,一般网站有反爬机制,检测到爬虫禁止访问
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36'
        # 用户代理,避免被发现是爬虫,告诉豆瓣浏览器我们是什么类型的机器(本质上是告诉浏览器我们可以接收什么水平的文件内容)
    }
    req = urlre.Request(url=url, headers=headers)
    try:
        response = urlre.urlopen(req)
        html = response.read().decode('utf-8')
        # print(html)
    except Exception as e:
        print(e)

    return html

# HTML源码中找到需要信息的标签,用正则模糊匹配
findLink = re.compile(r'<a href="(.*?)"') # 影片详情链接
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) # 影片图片,re.S去掉换行符
......
# 找到子网页的地址规律,给askUrl解析每个子网页
# 通过bs4中的BeautifulSoup搜索每个子网页的文档树
# 循环遍历每个子网页,将信息保存在列表中,最后将列表保存在存放列表的列表中
def getData(baseurl):
    datalist = []
    for i in range(10):   # 获取页面信息十次
        url = baseurl + str(i*25)
        html = askUrl(url)  # 保存获取到的网页源码
        # 逐一解析数据
        soup = BeautifulSoup(html,'html.parser')
        for item in soup.find_all('div',class_='item'):    # 查找符合要求的字符串,形成列表
            # print(item)
            data = []   # 保存一部电影的所有信息
            item = str(item)

            # 七项信息,其中titles占两个位置,数组中每八位保存一部电影信息
            # 影片详情链接
            link = re.findall(findLink,item)[0]   # 查找指定字符串
            data.append(link)
  			.....
            data.append(bd.strip())     # 去掉前后的空格
            datalist.append(data)       # 将处理好的一部电影信息放入datalist
            # for i in data:
            #     print(i)
    print('数据爬取成功')
    return datalist
# 保存数据到excel
def saveData(dataList,savePath):
    workbook = xlwt.Workbook(encoding='utf-8')
    worksheet = workbook.add_sheet('sheet1')
    colTitle = ('电影详情链接', '图片链接', '影片中文名', '影片英文名', '影片评分', '评价人数', '影片概况', '相关信息')
    for i in range(8):
        worksheet.write(0, i, colTitle[i])
    for i in range(250):
        item = dataList[i]
        for j in range(8):
            data = item[j]
            worksheet.write(i + 1, j, data)

    workbook.save(savePath)
# 保存数据到sqlite数据库
def saveDataBase(dataList,savePath):

    conn = sqlite3.connect(savePath)  # 打开或创建数据库文件
    cur = conn.cursor()

    sqlCr = '''
        create table db_top250 if not exists(
            id int primary key autoincrement,
            link text,
            img text,
            cname varchar,
            ename varchar,
            rated int,
            judge int,
            inq text,
            bd text
        );
    '''
    cur.execute(sqlCr)

    for item in dataList:
        for i in range(len(item)):
            if i == 4 or i == 5:
                continue

            item[i] = '"'+item[i]+'"'
        sqlIn = '''
            insert into db_top250(link,img,cname,ename,rated,judge,inq,bd) values(%s)
        ''' % ','.join(item)  # 将,添加在每个item之间
        cur.execute(sqlIn)
        conn.commit()

    cur.close()
    conn.close()

爬取结果

在这里插入图片描述
在这里插入图片描述

数据可视化

Flask框架目录结构

在这里插入图片描述

词云

import jieba    # 分词
from matplotlib import pyplot as plt  # 绘图,数据可视化
from wordcloud import WordCloud     # 词云
from PIL import Image               # 图形处理
import numpy as np                  # 矩阵运算
import sqlite3                      # 数据库

# 准备词云所需的文本
con = sqlite3.connect('../../movie.db')
cur = con.cursor()
sql = 'select inq from db_top250'
data = cur.execute(sql)
text = ''
for item in data:
    text = text + item[0]
# print(text)
cur.close()
con.close()

# 分词
cut = jieba.cut(text)
print(cut)  # 生成器<generator object Tokenizer.cut at 0x0CA06A38>
string = ' '.join(cut)
# print(len(string))  # 5543

img = Image.open('../../tree.jpg')  # 打开遮罩图片
img_array = np.array(img)           # 将图片转化为数组
wc = WordCloud(
    background_color='white',
    mask=img_array,
    font_path='simfang.ttf'     # 禹卫书法行书简体.ttf
)
wc.generate_from_text(string)

# 绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off')  # 坐标轴显示
# plt.show()

plt.savefig('../../word.jpg',dpi=500)

在这里插入图片描述

Echarts图表

Echarts官网

# 需要下载导入Echarts的js文件
<script src="../static/js/echarts.min.js"></script>

<script type="text/javascript">

       var myChart = echarts.init(document.getElementById('main-lb'));

       // 指定图表的配置项和数据
       option = {
      title:{
         text:'豆瓣评分'
      },
      color:['#3398DB'],
      tooltip: {
         trigger: 'axis',
         axisPointer: {            // 坐标轴指示器,坐标轴触发有效
            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
         }
      },
      grid: {
         left: '3%',
         right: '4%',
         bottom: '3%',
         containLabel: true
      },
      xAxis: [
         {
            type: 'category',
            data: {{ score|tojson }}
                       // ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            /*axisTick: {
               alignWithLabel: true
            }*/
         }
      ],
      yAxis: [
         {
            type: 'value'
         }
      ],
      series: [
         {
            name: 'score',
            type: 'bar',
            barWidth: '60%',
            data: {{count}}
                   // [10, 52, 200, 334, 390, 330, 220]
         }
      ]
   };

       // 使用刚指定的配置项和数据显示图表。
       myChart.setOption(option);


   </script>


   {
            type: 'value'
         }
      ],
      series: [
         {
            name: 'score',
            type: 'bar',
            barWidth: '60%',
            data: {{count}}
                   // [10, 52, 200, 334, 390, 330, 220]
         }
      ]
   };

       // 使用刚指定的配置项和数据显示图表。
       myChart.setOption(option);


   </script>

在这里插入图片描述

  • 15
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
随着科技的不断进步,我们的生活变得越来越离不开各种各样的程序。程序已成为我们日常生活和工作中不可或缺的一部分,它们可以帮助我们更高效地完成任务,节省时间和精力。今天,我要向大家介绍一款功能强大、用途广泛的程序,它具有万金油般的能力,可以为我们的生活带来极大的便利。 首先,这款程序具有非常强大的功能。它不仅可以帮助我们完成日常的文字处理、数据分析和报表制作等任务,还支持各种格式的文件读取和编辑。同时,它还具有多种工具和插件,可以扩展其功能,满足我们不同的需求。无论是工作还是生活,这款程序都能帮助我们轻松应对各种挑战。 其次,这款程序的界面设计非常友好。它的界面简洁明了,操作简单易懂,即使是不熟悉电脑操作的人也可以轻松上手。同时,它还支持自定义快捷键和界面主题,可以让我们根据自己的习惯和喜好进行个性设置。 此外,这款程序还具有出色的稳定性和安全性。它采用了先进的技术和算法,可以保护我们的文件和数据安全。同时,它还支持自动备份和恢复功能,即使出现意外情况,也可以帮助我们快速恢复到之前的状态。 总之,这款程序就像生活中的万金油一样,具有广泛的应用场景和多种功能。它可以为我们的生活和工作带来便利和效率,帮助我们更好地应对各种挑战。如果您还在为处理各种任务而烦恼,不妨尝试一下这款程序,或许它会成为您的得力助手。
爬虫(Web Crawler)是一种自动程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
### 回答1: 豆瓣电影是众所周知的一个知名电影评分网站,其中的TOP250电影榜单更是备受关注。爬取这个榜单的数据可以帮助我们更好地了解电影市场和评价,数据方面可以更好地呈现这些数据。 首先,我们可以使用Python程序编写爬虫,抓取豆瓣电影TOP250的数据。我们可以通过分析网页源代码,选取需要的信息,例如电影名称、上映时间、豆瓣评分、评分人数、电影类型、导演、演员等信息。然后,将所有信息保存在CSV文件中。我们可以使用BeautifulSoup模块或Scrapy框架来实现爬虫程序的编写。 接下来,我们可以使用Python数据工具来对这些数据进行可处理。例如,我们可以使用matplotlib或Seaborn绘制电影评分的统计图表和线型图,了解每部电影评分的分布情况、评分人数的多寡、豆瓣评分的走向等。另外,我们也可以绘制散点图或热图,从电影类型、上映时间等角度分析不同类型电影的评分情况。我们还可以利用词云图工具呈现电影的标签云图,更直观地展示豆瓣用户对电影的评价。 总的来说,我们可以使用Python爬虫数据工具来爬取豆瓣电影TOP250榜单的数据,并且将数据以图表、统计、云图等形式进行可分析,从而更好地了解电影市场和评价。 ### 回答2: 豆瓣电影Top250是电影爱好者们都很熟悉的一个电影排行榜。为了更好地了解这个排行榜的情况,我们可以利用Python爬取豆瓣电影Top250上的电影信息,并将数据制作成可图表,以更直观地呈现数据。 首先,我们需要使用Python爬虫技术获取豆瓣电影Top250中每部电影的信息。一般来说,爬取网页数据需要用到一些第三方爬虫库,比如Requests和BeautifulSoup。使用Requests库可以向豆瓣服务器发送请求,获取Top250的网页HTML文件。接着,我们可以使用BeautifulSoup库解析HTML文件,从中获取每一部电影的名称、评分、演员、导演、简介等信息。爬取完毕后,将获取到的数据存储在MySQL或者MongoDB数据库中,方便后续对数据的处理和分析。 接下来,我们需要将获取到的数据进行数据。我们可以使用Python中的Matplotlib或者Seaborn等数据库来制作可图表。比如,我们可以生成柱状图、饼图、折线图等多种图表类型,展现Top250中电影各类别的数量分布、电影评分的分布情况、导演、演员等数据的贡献度等信息。 总之,通过Python爬取豆瓣电影Top250数据,并利用数据技术制作图表,我们可以更好地了解电影市场的情况,从中找到一些有用的数据洞察点,对后续的电影市场分析等工作提供有力支持。 ### 回答3: 随着互联网的普及和数据挖掘的发展,数据已经成为当今最流行的技术之一。而Python语言的出现,极大地促进了数据技术的发展,并且能够使数据更加高效、便捷。 Python爬取豆瓣电影Top250数据可以使用爬虫框架Scrapy,通过对网页的解析和内容抓取,将所需数据存入数据集中。数据集中存储了每个电影的名称、导演、主演、类型、上映时间、评价人数、评分等信息,这些数据可以通过Python数据工具如Matplotlib、Pandas等进行可处理。 通过数据可以得到丰富的数据分析和呈现,如: 1.不同类型电影的数量 通过Python工具可以得到不同类型电影的数量,并且可以使用饼图、柱状图等图表进行图像展示,帮助人们更好地了解豆瓣Top250电影中各类型的分布情况。 2.电影排名及评价情况 通过Python爬虫框架获取的豆瓣Top250电影可以进行排名展示及评价等数据的分析。可工具可以帮助我们通过散点图、折线图等形式直观地了解电影排名及评价情况。 3.电影时长对评分的影响 通过Python工具可处理电影时长对评分的影响。可以得出电影时长对于电影评分存在明显影响的结论,以饼图的形式将主观评价高的电影与电影时长进行对比。 Python爬取豆瓣电影Top250,通过数据工具可以使我们直观地了解到豆瓣Top250电影的分类情况、排名和评价等数据信息,同时,也可以了解到电影时长等因素对电影评价的影响,这对我们对电影的分析与推荐可以起到积极的作用,有助于我们更好地了解电影行业的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值