python爬虫之selenium嵌套网页示例讲解

news/2024/11/28 9:28:35/

Selenium是一款非常流行的Web自动化测试框架,它可以模拟用户在浏览器上执行的各类操作,如:点击链接,填写表单,滚动页面等。这使得Selenium成为了一个非常强大的爬虫工具。在爬取网页时,Selenium可以通过模拟用户的操作来解决一些常见的爬虫难题,如JavaScript渲染或需要登录的页面等。在本文中,我们将以一个嵌套页面爬取为例,介绍如何使用Selenium进行页面爬取。

问题背景

我们以爬取某个在线学习平台的学生列表为例。在该学习平台中,学生名单是被嵌套在一个包含多个页面的页面中的。其中,每个页面只会展示10个学生的信息。

我们需要爬取所有的学生信息,并保存为一个表格文件。由于每个页面只能展示10个学生的信息,因此我们需要通过翻页的方式来逐页爬取数据。如果使用传统的requests库进行爬取,我们需要手动解析页面中的JavaScript代码,并模拟AJAX请求进行翻页,这是非常麻烦的。而使用Selenium,我们则可以直接模拟用户操作来实现翻页。

环境准备

在开始之前,我们需要安装Selenium和Chrome浏览器的驱动程序。这里我们以Mac OS X系统为例,Windows系统的步骤类似。

安装Selenium

pip install selenium

安装Chrome浏览器驱动

从ChromeDriver官网下载与你Chrome浏览器版本相对应的驱动,并将其解压到你的系统中。

代码实现

在代码实现时,我们将分为三个步骤:

  1. 打开页面,并登录到学习平台;
  2. 翻页并爬取每页的学生信息;
  3. 保存数据为表格文件。

打开页面并登录

我们首先需要载入需要的库并设置Chrome驱动程序的路径。

from selenium import webdriver
import time# 设置Chrome驱动路径
driver_path = '/path/to/chromedriver'

然后我们可以定义一个函数来打开学习平台的登录页面,并输入用户名和密码进行登录。

def login(driver):# 打开登录页面driver.get('https://www.xxxxx.com/login')# 找到用户名和密码的输入框,并输入相应的用户名和密码username_input = driver.find_element_by_id('username')username_input.send_keys('your_username')password_input = driver.find_element_by_id('password')password_input.send_keys('your_password')# 找到登录按钮,并点击login_button = driver.find_element_by_css_selector('[type=submit]')login_button.click()

翻页并爬取数据

在登录成功后,我们需要翻页并爬取每页的学生信息。由于我们需要翻页,因此我们需要在代码中模拟用户点击下一页按钮的操作。另外,我们还需要对每个学生的信息进行解析并保存。

学生信息的格式

我们首先需要定义学生信息的数据结构。在此,我们将每个学生的信息存储为一个字典,其包含学生的ID(id)、姓名(name)、邮箱(email)和所属班级(class)。

student = {'id': '','name': '','email': '','class': '',
}

点击下一页按钮

要翻页操作,我们需要让程序模拟鼠标点击页面中的下一页按钮。在此,我们可以定义一个next_page函数来实现这个功能。这个函数的参数是当前的页面driver,我们需要使用driver`找到下一页的按钮并模拟鼠标的点击操作。

def next_page(driver):# 找到下一页的按钮next_button = driver.find_element_by_css_selector('.next')# 如果按钮不可点击,说明达到了最后一页,返回Falseif 'disabled' in next_button.get_attribute('class'):return False# 否则点击下一页按钮else:next_button.click()return True

解析学生信息

在爬取每页的学生信息时,我们需要将每个学生的信息解析出来。在此,我们可以定义一个parse_students函数来实现这个功能。这个函数的参数是当前页面的源代码page_source,我们需要使用BeautifulSoup库来解析HTML代码并提取学生信息。

from bs4 import BeautifulSoupdef parse_students(page_source):# 解析页面源代码soup = BeautifulSoup(page_source, 'html.parser')# 找到学生信息所在的表格table = soup.find('table', {'class': 'students'})# 找到表格中的所有行rows = table.find_all('tr')students = []# 遍历表格中的每一行,提取每个学生的信息,并存储到students列表中for row in rows[1:]:  # 注意要去掉表头cols = row.find_all('td')student = {'id': cols[0].text,'name': cols[1].text,'email': cols[2].text,'class': cols[3].text,}students.append(student)return students

爬取每页的学生信息

我们可以定义一个get_students函数来实现每页的学生信息爬取。这个函数的参数是当前页面的driver,我们首先需要等待页面加载完成,然后调用parse_students函数来解析页面,并返回所有学生的信息。

def get_students(driver):# 等待页面加载完成time.sleep(2)# 解析当前页面中的所有学生信息students = parse_students(driver.page_source)return students

完整代码

下面是完整的代码实现。

from selenium import webdriver
from bs4 import BeautifulSoup
import time# 设置Chrome驱动路径
driver_path = '/path/to/chromedriver'def login(driver):# 打开登录页面driver.get('https://www.xxxxx.com/login')# 找到用户名和密码的输入框,并输入相应的用户名和密码username_input = driver.find_element_by_id('username')username_input.send_keys('your_username')password_input = driver.find_element_by_id('password')password_input.send_keys('your_password')# 找到登录按钮,并点击login_button = driver.find_element_by_css_selector('[type=submit]')login_button.click()def next_page(driver):# 找到下一页的按钮next_button = driver.find_element_by_css_selector('.next')# 如果按钮不可点击,说明达到了最后一页,返回Falseif 'disabled' in next_button.get_attribute('class'):return False# 否则点击下一页按钮else:next_button.click()return Truedef parse_students(page_source):# 解析页面源代码soup = BeautifulSoup(page_source, 'html.parser')# 找到学生信息所在的表格table = soup.find('table', {'class': 'students'})# 找到表格中的所有行rows = table.find_all('tr')students = []# 遍历表格中的每一行,提取每个学生的信息,并存储到students列表中for row in rows[1:]:  # 注意要去掉表头cols = row.find_all('td')student = {'id': cols[0].text,'name': cols[1].text,'email': cols[2].text,'class': cols[3].text,}students.append(student)return studentsdef get_students(driver):# 等待页面加载完成time.sleep(2)# 解析当前页面中的所有学生信息students = parse_students(driver.page_source)return students
def main():# 创建Chrome浏览器实例driver = webdriver.Chrome(driver_path)# 打开登录页面并登录login(driver)# 初始化学生列表all_students = []# 开始翻页并爬取学生信息while True:# 爬取当前页的学生信息students = get_students(driver)all_students += students# 如果已经达到最后一页,退出循环if not next_page(driver):break# 关闭浏览器driver.quit()# 输出学生数量和前几个学生的信息print(f'Total {len(all_students)} students:')for student in all_students[:5]:print(student)if __name__ == '__main__':main()


结语

通过以上这个例子,我们学习了如何使用Selenium来爬取嵌套页面中的数据。在实际的爬虫开发中,还有很多需要注意的地方,如防止被反爬,避免频繁请求等。我们需要根据不同的网站和场景进行针对性的开发。同时,我们也可以结合其他库和技术,如多线程、分布式爬虫、代理池等来提高爬虫效率和稳定性


http://www.ppmy.cn/news/245405.html

相关文章

运维工程师的职责和重要性

运维工程师,是一个什么样的岗位呢?外行看起来就是搞服务器维护的,其实不然。运维工程师是负责管理和维护计算机系统、网络和基础架构的专业人员。他们的职责是确保系统的正常运行,提供技术支持,并处理系统故障和问题。…

Segment Anything学习小结

论文地址:Segment Anything 项目地址:https://github.com/facebookresearch/segment-anything 在线Demo: https://segment-anything.com/demo 前言 近日,MetaAI团队开源了一个用于分割的10亿个masks,1100w张图片数…

小红书热搜榜TOP1,多巴胺时尚爆火,怎么抄作业?

今夏时尚,明媚与简约并存。要说今年夏天什么最火?多巴胺必须拥有姓名。无论男女、老少、人宠,都被这股快乐风带飞。 “多巴胺”有多火?就只是彩色穿搭吗?各大博主、品牌若想加入,要怎么玩?今儿&…

推动开源与商业共生共赢 | 2023开放原子全球开源峰会开源商业化创新发展分论坛即将启幕

开源具有利他性,专有软件或私有软件具有利己性,而开源的商业模式也具有利己性。利他性的开源与利己性的商业模式相结合,如何真正为开源做贡献? 由开放原子开源基金会主办,软通动力信息技术(集团&#xff0…

人工智能直播的趋势分析报告

人工智能直播是指通过人工智能技术来模拟真人直播,通过机器学习和自然语言处理等技术实现。随着人工智能技术的不断发展,人工智能直播在近年来得到了广泛应用。 一、人工智能直播的优势 节省成本:相比传统直播,人工智能直播不需要…

第六次股票交易日志

股票沪A新华网603888。 2021.11.2买入30400股,每股价格18.35。 2021.11.3卖出30400股,每股价格18.62。 卖出前总市值566656。 盈利8208。 总资产571198。 本次股票交易的行为与策略与上次交易基本相同,唯一的区别是本次交易卖出日的价格…

1209 幂之和

题目描述 给定一个n 位整数 (n≥3 ),判断它的每个位上的数字的 n 次幂之和是否等于它本身。 例如: 3位数153(此时n3),1^3 5^3 3^3153 4位数8208(此时n4),842404848208 代码如下…

C语言基础-判断一个范围内的水仙花数(含判断一个数是否为水仙花数)

题目描述 水仙花数是一个N位数。如果一个数各个位上的数字的N次方的和等于这个数的话,这个数就是水仙花数。 输入整数位数,求这个位数的所有水仙花数。 样例输入 4样例输出 1634 8208 9474代码实现 int getIntLen(int num); bool isFlowerNumber(int…