爬虫基础之爬取猫眼Top100 可视化

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003

网站: TOP100榜 - 猫眼影戏 - 一网打尽好影戏
 
本次案例所需用到的模块  requests (发送HTTP请求)
pandas(数据处置惩罚和分析 保存数据)

  
parsel(剖析HTML数据) 

pyecharts(数据可视化图表)
pymysql(毗连和操作MySQL数据库)

lxml(数据剖析模块)






确定爬取的内容:


  • 影戏名称
  • 影戏主演
  • 上映时间
  • 评分
分析页面:

确认是静态数据还是动态数据
右击打开网页源代码   快捷键Ctrl+F 打开搜索框 搜索必要爬取的数据


可以发现 此数据为静态数据  即所必要的数据都在网页上面
爬取步骤:

一.发送请求 模拟欣赏器向服务器发送请求

二. 剖析数据   从网页中提取数据

三. 保存数据  将爬取到的数据保存为本地文件



OK 我们开始写代码
将欣赏器的url地点复制 构建请求头参数
此网站必要登岸 才能拿到数据 请求体中一样平常包含三个数据 UA(欣赏器的基本信息) referer(就是防盗链 即当前页面通过哪个页面跳转过来的)  cookie(用户的一些基本信息)

  1. # 导包
  2. import requests
  3. url = 'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false'
  4. headers = {
  5.     'user-agent':
  6.         'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
  7.     'referer':
  8.         'https://www.maoyan.com/',
  9.     'cookie':
  10.         '你的cookie'
  11. }
  12. resp = requests.get(url,headers=headers)
  13. print(resp.text)
复制代码
打印我们从欣赏器爬取下来的信息
Ctrl+F 快捷键 搜索确认 数据在返回的信息中 



第二步 剖析数据

打开开发者工具中的元素 用左上角的小箭头去检察页面的布局

定位元素 拿到对应的class属性值  采取parserl模块里面的css 的来提取数据

我们可以看到  爬取下来的内容中 有空格 缩进
处置惩罚办法: 转换成字符串范例的格式 然后利用strip()方法 去掉空格 replace 更换方法去除不要的文字  只保留主演名字


  1. movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
  2. # 上映时间也一样 只保留时间
复制代码
最后 这个评分是分开的  必要做个字符串的拼接

getall() 拿到所有满意条件的class属性为score 下面i 标签中的文本  其返回的是个列表 通过对列表取值 就可以拿到这两个分开的评分  最后拼接起来 输出打印莫题目
  1. movie_s = li.css('.score i::text').getall()[0]
  2. movie_ore = li.css('.score i::text').getall()[-1]
  3. movie_score = movie_s + movie_ore
复制代码
所有的信息提取完毕 接下来我们保存数据
三.保存数据

将数据存储在字典中  在表面定义一个空列表  最后将字典添加到列表中
  1. data = []
  2. dit = {
  3.   '电影名': movie_name,
  4.   '主演': movie_actor,
  5.   '上映时间': movie_time,
  6.   '评分': movie_score
  7. }
  8. data.append(dit)
复制代码
最后听过pandas 保存数据  
  1. # 传入我们的列表 设置索引列为false 即不生成额外的一列索引
  2. pd.DataFrame(data).to_excel('Top100.xlsx', index=False)
复制代码
本次爬虫板块的代码如下  另有保存到数据库的就不解说了 具体的话看我之前的文章
多页爬取的话 分析几页的url地点可得  多了个offset参数 每页间隔10 后续通过for循环遍历即可 

  1. import requests
  2. import parsel
  3. import pandas as pd
  4. import pymysql
  5. # 建立连接
  6. connect = pymysql.connect(
  7.     user='root',
  8.     password="112233",
  9.     host='localhost',
  10.     database='douban', )
  11. # 拿游标
  12. cursor = connect.cursor()
  13. # 此模块集成了css  xpath re正则三种解析数据的模块
  14. data = []
  15. for page in range(0, 101, 10):
  16.     url = f'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false&offset={page}'
  17.     headers = {
  18.         'user-agent':
  19.             'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
  20.         'referer':
  21.             'https://www.maoyan.com/',
  22.         'cookie':
  23.             '你的cookie'
  24.     }
  25.     resp = requests.get(url, headers=headers)
  26.     selector = parsel.Selector(resp.text)
  27.     lis = selector.css('.board-wrapper dd')
  28.     for li in lis:
  29.         movie_name = li.css('.name a::attr(title)').get()
  30.         movie_actor = li.css('.star::text').get().strip().replace('主演:', '')
  31.         movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
  32.         movie_s = li.css('.score i::text').getall()[0]
  33.         movie_ore = li.css('.score i::text').getall()[-1]
  34.         movie_score = movie_s + movie_ore
  35.         dit = {
  36.             '电影名': movie_name,
  37.             '主演': movie_actor,
  38.             '上映时间': movie_time,
  39.             '评分': movie_score
  40.         }
  41.         data.append(dit)
  42.         
  43.     # pd.DataFrame(data).to_excel('Top100.xlsx', index=False)
  44.     #     准备sql语句
  45.         sql = 'insert into top100 values (%s,%s,%s,%s)'
  46.         cursor.executemany(sql,[(movie_name,movie_actor,movie_time,movie_score)])
  47.         # 提交事务
  48.         connect.commit()
复制代码
爬取的数据如下: 


 接着我们洗濯数据  将excel文件中上映时间的字段 中的国家地名去掉  只保留纯日期数值
至于如何检察 数据的一些信息 语法就不在这里介绍了 可以看之前的文章

  1. # 导包 读取文件
  2. import pandas as pd
  3. df = pd.read_excel('Top100.xlsx', index_col=False)
  4. # 将上映时间这一列的数据中的日期提取出来 重新赋值给上映时间这一列
  5. df['上映时间'] = df['上映时间'].str.extract(r'(\d{4}-\d{2}-\d{2})')
  6. # 去除空数据
  7. # 将数据中的空数据去除  在原有的数据上
  8. df.dropna(inplace=True)
  9. # 将处理好的数据保存到新的文件中  不生成索引列
  10. df.to_excel('new_Top.xlsx', index=False)
复制代码

  1. # 导包
  2. from pyecharts.charts import Line
  3. from pyecharts import options as opts
  4. # 生成柱状图
  5. c = (
  6.     Line()
  7.     # 添加x轴 数据 将电影名这一列的数据转换成列表
  8.     .add_xaxis(df['电影名'].tolist())
  9.     # 添加y轴 设置y轴名称  同样将数据转换成列表
  10.     .add_yaxis('评分', df['评分'].tolist())
  11.     # 设置 配置项
  12.     .set_global_opts(
  13.         # 标题与副标题的设置
  14.         title_opts=opts.TitleOpts(title="Top100电影评分", subtitle='副标题'),
  15.         # x轴相关的设置  设置x轴的数据 向右旋转45 -45 为逆时针
  16.         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
  17.     )
  18.     # 列的设置 不显示每一列上面的数据
  19.     .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  20. )
  21. # 生成html 文件
  22. c.render('Top100.html')
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表