当前位置:   article > 正文

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

selenium内嵌页面

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驱动程序的路径。

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

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

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

翻页并爬取数据

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

学生信息的格式

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

  1. student = {
  2. 'id': '',
  3. 'name': '',
  4. 'email': '',
  5. 'class': '',
  6. }

点击下一页按钮

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

  1. def next_page(driver):
  2. # 找到下一页的按钮
  3. next_button = driver.find_element_by_css_selector('.next')
  4. # 如果按钮不可点击,说明达到了最后一页,返回False
  5. if 'disabled' in next_button.get_attribute('class'):
  6. return False
  7. # 否则点击下一页按钮
  8. else:
  9. next_button.click()
  10. return True

解析学生信息

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

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

爬取每页的学生信息

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

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

完整代码

下面是完整的代码实现。

  1. from selenium import webdriver
  2. from bs4 import BeautifulSoup
  3. import time
  4. # 设置Chrome驱动路径
  5. driver_path = '/path/to/chromedriver'
  6. def login(driver):
  7. # 打开登录页面
  8. driver.get('https://www.xxxxx.com/login')
  9. # 找到用户名和密码的输入框,并输入相应的用户名和密码
  10. username_input = driver.find_element_by_id('username')
  11. username_input.send_keys('your_username')
  12. password_input = driver.find_element_by_id('password')
  13. password_input.send_keys('your_password')
  14. # 找到登录按钮,并点击
  15. login_button = driver.find_element_by_css_selector('[type=submit]')
  16. login_button.click()
  17. def next_page(driver):
  18. # 找到下一页的按钮
  19. next_button = driver.find_element_by_css_selector('.next')
  20. # 如果按钮不可点击,说明达到了最后一页,返回False
  21. if 'disabled' in next_button.get_attribute('class'):
  22. return False
  23. # 否则点击下一页按钮
  24. else:
  25. next_button.click()
  26. return True
  27. def parse_students(page_source):
  28. # 解析页面源代码
  29. soup = BeautifulSoup(page_source, 'html.parser')
  30. # 找到学生信息所在的表格
  31. table = soup.find('table', {'class': 'students'})
  32. # 找到表格中的所有行
  33. rows = table.find_all('tr')
  34. students = []
  35. # 遍历表格中的每一行,提取每个学生的信息,并存储到students列表中
  36. for row in rows[1:]: # 注意要去掉表头
  37. cols = row.find_all('td')
  38. student = {
  39. 'id': cols[0].text,
  40. 'name': cols[1].text,
  41. 'email': cols[2].text,
  42. 'class': cols[3].text,
  43. }
  44. students.append(student)
  45. return students
  46. def get_students(driver):
  47. # 等待页面加载完成
  48. time.sleep(2)
  49. # 解析当前页面中的所有学生信息
  50. students = parse_students(driver.page_source)
  51. return students
  52. def main():
  53. # 创建Chrome浏览器实例
  54. driver = webdriver.Chrome(driver_path)
  55. # 打开登录页面并登录
  56. login(driver)
  57. # 初始化学生列表
  58. all_students = []
  59. # 开始翻页并爬取学生信息
  60. while True:
  61. # 爬取当前页的学生信息
  62. students = get_students(driver)
  63. all_students += students
  64. # 如果已经达到最后一页,退出循环
  65. if not next_page(driver):
  66. break
  67. # 关闭浏览器
  68. driver.quit()
  69. # 输出学生数量和前几个学生的信息
  70. print(f'Total {len(all_students)} students:')
  71. for student in all_students[:5]:
  72. print(student)
  73. if __name__ == '__main__':
  74. main()


结语

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/489022
推荐阅读
相关标签
  

闽ICP备14008679号