selenium爬虫

ops/2024/12/12 20:50:40/

跟着大佬学习
大佬的博客获取一页数据没有问题。多页请求就会触发猫眼的验证中心,没有数据,所以优化加强了一下,一起进步学习。
ip代理网站:https://www.zdaye.com/free/4/ip(用了selenium这一步骤ip代理可以忽略)
cmd命令 pip install selenium
还需要安装:ChromeDriver安装包到python安装位置

Selenium 需要安装 ChromeDriver:确保你已经安装了与 Chrome 浏览器版本匹配的 ChromeDriver。

地址下载:https://registry.npmmirror.com/binary.html?path=chrome-for-testing
找到对应的谷歌版本
在这里插入图片描述

在这里插入图片描述
将下载的包解压,把内容全部复制到python的目录下
在这里插入图片描述
测试:

import timefrom selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://www.bing.com")
time.sleep(3)
driver.quit()

运行代码,自动打开浏览器
在这里插入图片描述
开始爬取猫眼电影数据
pip安装库

pip install requests beautifulsoup4 pandas matplotlib seaborn
# 导入selenium
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# 导入解析html库BeautifulSoup
from bs4 import BeautifulSoup
# 导入数据分析
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sns
import reimport time
import random# 设置Matplotlib使用的字体为SimHei(黑体),以支持中文显示
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 设置目标URL基础部分
base_url = 'https://www.maoyan.com/board/4?offset={}'# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头模式,不打开浏览器窗口
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")# 设置ChromeDriver路径
service = Service('D:\\env\\python3\\chromedriver.exe')# 初始化WebDriver
driver = webdriver.Chrome(service=service, options=chrome_options)# 存储所有电影信息的列表
movies = []
page = 0
# 爬取10页数据,每页偏移量为0, 10, 20, ..., 90
for offset in range(0, 91, 10):url = base_url.format(offset)  # 构造每一页的URLprint(url)driver.get(url)time.sleep(random.uniform(5, 10))  # 等待页面加载# 获取页面源代码html = driver.page_source# 提取电影列表# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(html, 'html.parser')# print(soup)print(soup.find_all('dd'))# 提取电影列表page += 1for item in soup.find_all('dd'):movie = {}print("正在爬取第{}页数据".format(page))# 获取电影名称,从a标签的title属性中提取movie['name'] = item.find('a')['title'].strip() if item.find('a') else 'N/A'# 获取评分,确保评分字段存在score_tag = item.find('p', class_='score')movie['score'] = score_tag.text.strip() if score_tag else 'N/A'# 获取上映时间,确保上映时间字段存在release_time_tag = item.find('p', class_='releasetime')release_time = release_time_tag.text.strip() if release_time_tag else 'N/A'# 使用正则表达式清洗数据,提取年份部分movie['release_time'] = re.findall(r'\d{4}', release_time)  # 匹配年份if movie['release_time']:movie['release_time'] = movie['release_time'][0]  # 只取第一个年份else:movie['release_time'] = 'N/A'  # 如果没有找到年份,设置为'N/A'# 将电影信息添加到列表中movies.append(movie)# 关闭浏览器
driver.quit()# 将数据存储到pandas DataFrame
df = pd.DataFrame(movies)# 输出前5行数据
# print("爬取的数据:")
# print(df.head())# 数据清洗:去除空值并处理评分数据
df.dropna(subset=['score', 'release_time'], inplace=True)  # 删除评分和上映时间为空的行# 将评分转换为数值类型,无法转换的设置为NaN
df['score'] = pd.to_numeric(df['score'], errors='coerce')# 删除评分为空的行
df.dropna(subset=['score'], inplace=True)# 将release_time列转换为数值类型的年份
df['release_year'] = pd.to_numeric(df['release_time'], errors='coerce')# 输出清洗后的数据
# print("清洗后的数据:")
# print(df.head())# 保存数据为CSV文件
df.to_csv('maoyan_top100.csv', index=False)# 数据分析:电影评分分布
plt.figure(figsize=(8, 6))
sns.histplot(df['score'], bins=20, kde=True)
plt.title('电影评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()# 数据分析:电影上映年份分布
plt.figure(figsize=(10, 6))
sns.countplot(x='release_year', data=df)
plt.title('电影上映年份分布')
plt.xticks(rotation=45)
plt.xlabel('年份')
plt.ylabel('电影数量')
plt.show()# 结束
print("爬取和分析完成!数据已保存至 maoyan_top100.csv")

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


http://www.ppmy.cn/ops/141340.html

相关文章

清理 zabbix 历史数据, 缩减 postgresql 空间

在 Zabbix 中使用 PostgreSQL 作为数据库后端时,随着监控数据的不断积累,数据库可能会变得非常大,从而导致存储空间紧张。为了清理 Zabbix 历史数据并缩减 PostgreSQL 空间,您可以按照以下步骤进行操作: 一、分析数据…

k8s-Informer概要解析(2)

Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…

使用 Temporal 管理和调度 Couchbase SQL 脚本的实际例子

场景描述 目标:使用 Temporal 管理和调度一组 Couchbase SQL 脚本来完成以下任务: 同步数据:从其他数据源同步数据到 Couchbase。 执行数据聚合:运行统计 SQL 查询。 清理过期数据:定期清理 Couchbase 中过期或无效…

原生html+css+ajax实现二级下拉选择的增删改及树形结构列出

<?php $db_host localhost; $db_user info_chalide; $db_pass j8c2rRr2RnA; $db_name info_chalide; /* 数据库结构SQL CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, parent_id INT DEFAULT 0 ); */ try { $pdo new PD…

[笔记] 持续一个月的电路调试工作

11月下旬&#xff0c;入职一家负责系统集成&#xff0c;但是触手已经触及大量的电力电子相关的模块设计的公司。入职时谈及的工作方向有三个&#xff0c;一个是一款手头正在做的开关电源的调优&#xff1b;一个是一款新型PWM移相开关电源的工作&#xff1b;最后一项是我非常期望…

Cocos创建编辑器扩展的简单介绍

&#xff08;一&#xff09; 创建一个扩展的入口&#xff0c;点击之后会弹出面板&#xff0c;我目前只尝试了第一个模板&#xff08;空白&#xff09;&#xff0c;在里面写下扩展名&#xff08;扩展名不能有大写字母&#xff09;&#xff0c;作者等等信息之后 点击创建扩…

渗透利器-kali工具 (第四章-5) 爬虫入门

Python爬虫入门[spider] 1&#xff0c;交换机制&#xff1a; 服务器与本地的交换机制&#xff1a; http协议&#xff1a;客户端与服务器一种会话的方式。 客户端-------[requests[请求]]------->服务器 客户端-------[response[响应]]------>服务器 HTTP请求&#xff1a…

【HarmonyOS实战开发】鸿蒙JS崩溃分析

当未处理的JS异常导致应用意外退出时&#xff0c;应用会生成对应的JS崩溃日志文件&#xff0c;开发者可通过错误日志查看引起崩溃的代码位置及分析应用崩溃的原因。本文将分别介绍JS崩溃分析思路以及典型分析案例。 一、日志信息 以下是崩溃日志信息中对应字段解释。 Device…