网站: TOP100榜 - 猫眼影戏 - 一网打尽好影戏
本次案例所需用到的模块 requests (发送HTTP请求) pandas(数据处置惩罚和分析 保存数据)
parsel(剖析HTML数据)
pyecharts(数据可视化图表) pymysql(毗连和操作MySQL数据库)
lxml(数据剖析模块)
确定爬取的内容:
分析页面:
确认是静态数据还是动态数据
右击打开网页源代码 快捷键Ctrl+F 打开搜索框 搜索必要爬取的数据
可以发现 此数据为静态数据 即所必要的数据都在网页上面
爬取步骤:
一.发送请求 模拟欣赏器向服务器发送请求
二. 剖析数据 从网页中提取数据
三. 保存数据 将爬取到的数据保存为本地文件
OK 我们开始写代码
将欣赏器的url地点复制 构建请求头参数
此网站必要登岸 才能拿到数据 请求体中一样平常包含三个数据 UA(欣赏器的基本信息) referer(就是防盗链 即当前页面通过哪个页面跳转过来的) cookie(用户的一些基本信息)
- # 导包
- import requests
- url = 'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false'
- headers = {
- 'user-agent':
- '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',
- 'referer':
- 'https://www.maoyan.com/',
- 'cookie':
- '你的cookie'
- }
- resp = requests.get(url,headers=headers)
- print(resp.text)
复制代码 打印我们从欣赏器爬取下来的信息
Ctrl+F 快捷键 搜索确认 数据在返回的信息中
第二步 剖析数据
打开开发者工具中的元素 用左上角的小箭头去检察页面的布局
定位元素 拿到对应的class属性值 采取parserl模块里面的css 的来提取数据
我们可以看到 爬取下来的内容中 有空格 缩进
处置惩罚办法: 转换成字符串范例的格式 然后利用strip()方法 去掉空格 replace 更换方法去除不要的文字 只保留主演名字
- movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
- # 上映时间也一样 只保留时间
复制代码 最后 这个评分是分开的 必要做个字符串的拼接
getall() 拿到所有满意条件的class属性为score 下面i 标签中的文本 其返回的是个列表 通过对列表取值 就可以拿到这两个分开的评分 最后拼接起来 输出打印莫题目
- movie_s = li.css('.score i::text').getall()[0]
- movie_ore = li.css('.score i::text').getall()[-1]
- movie_score = movie_s + movie_ore
复制代码 所有的信息提取完毕 接下来我们保存数据
三.保存数据
将数据存储在字典中 在表面定义一个空列表 最后将字典添加到列表中
- data = []
- dit = {
- '电影名': movie_name,
- '主演': movie_actor,
- '上映时间': movie_time,
- '评分': movie_score
- }
- data.append(dit)
复制代码 最后听过pandas 保存数据
- # 传入我们的列表 设置索引列为false 即不生成额外的一列索引
- pd.DataFrame(data).to_excel('Top100.xlsx', index=False)
复制代码 本次爬虫板块的代码如下 另有保存到数据库的就不解说了 具体的话看我之前的文章
多页爬取的话 分析几页的url地点可得 多了个offset参数 每页间隔10 后续通过for循环遍历即可
- import requests
- import parsel
- import pandas as pd
- import pymysql
- # 建立连接
- connect = pymysql.connect(
- user='root',
- password="112233",
- host='localhost',
- database='douban', )
- # 拿游标
- cursor = connect.cursor()
- # 此模块集成了css xpath re正则三种解析数据的模块
- data = []
- for page in range(0, 101, 10):
- url = f'https://www.maoyan.com/board/4?timeStamp=1741780786427&channelId=40011&index=2&signKey=30a132dd14a76c19cfd2759ba27adc28&sVersion=1&webdriver=false&offset={page}'
- headers = {
- 'user-agent':
- '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',
- 'referer':
- 'https://www.maoyan.com/',
- 'cookie':
- '你的cookie'
- }
- resp = requests.get(url, headers=headers)
- selector = parsel.Selector(resp.text)
- lis = selector.css('.board-wrapper dd')
- for li in lis:
- movie_name = li.css('.name a::attr(title)').get()
- movie_actor = li.css('.star::text').get().strip().replace('主演:', '')
- movie_time = li.css('.releasetime::text').get().replace('上映时间:', '')
- movie_s = li.css('.score i::text').getall()[0]
- movie_ore = li.css('.score i::text').getall()[-1]
- movie_score = movie_s + movie_ore
- dit = {
- '电影名': movie_name,
- '主演': movie_actor,
- '上映时间': movie_time,
- '评分': movie_score
- }
- data.append(dit)
-
- # pd.DataFrame(data).to_excel('Top100.xlsx', index=False)
- # 准备sql语句
- sql = 'insert into top100 values (%s,%s,%s,%s)'
- cursor.executemany(sql,[(movie_name,movie_actor,movie_time,movie_score)])
- # 提交事务
- connect.commit()
复制代码 爬取的数据如下:
接着我们洗濯数据 将excel文件中上映时间的字段 中的国家地名去掉 只保留纯日期数值
至于如何检察 数据的一些信息 语法就不在这里介绍了 可以看之前的文章
- # 导包 读取文件
- import pandas as pd
- df = pd.read_excel('Top100.xlsx', index_col=False)
- # 将上映时间这一列的数据中的日期提取出来 重新赋值给上映时间这一列
- df['上映时间'] = df['上映时间'].str.extract(r'(\d{4}-\d{2}-\d{2})')
- # 去除空数据
- # 将数据中的空数据去除 在原有的数据上
- df.dropna(inplace=True)
- # 将处理好的数据保存到新的文件中 不生成索引列
- df.to_excel('new_Top.xlsx', index=False)
复制代码
- # 导包
- from pyecharts.charts import Line
- from pyecharts import options as opts
- # 生成柱状图
- c = (
- Line()
- # 添加x轴 数据 将电影名这一列的数据转换成列表
- .add_xaxis(df['电影名'].tolist())
- # 添加y轴 设置y轴名称 同样将数据转换成列表
- .add_yaxis('评分', df['评分'].tolist())
- # 设置 配置项
- .set_global_opts(
- # 标题与副标题的设置
- title_opts=opts.TitleOpts(title="Top100电影评分", subtitle='副标题'),
- # x轴相关的设置 设置x轴的数据 向右旋转45 -45 为逆时针
- xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
- )
- # 列的设置 不显示每一列上面的数据
- .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
- )
- # 生成html 文件
- c.render('Top100.html')
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |