【Python_Selenium学习笔记(三)】基于Selenium模块实现无界面模式 执行JS脚本(把滚动条拉到底部)

news/2024/7/19 11:42:44 标签: python, selenium, 爬虫

基于Selenium模块实现无界面模式 & 执行JS脚本(把滚动条拉到底部)

前言

此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 & 执行JS脚本(把滚动条拉到底部),并以具体的示例进行展示。

正文

1、Selenium 设置无界面模式

  1. 创建浏览器对象之前,创建 options 功能对象 :options = webdriver.ChromeOptions()
  2. 添加无界面功能参数:options.add_argument("--headless")
  3. 构造浏览器对象,打开浏览器,并设置 options 参数:browser = webdriver.Chrome(options=options)
python">from selenium import webdriver

options = webdriver.ChromeOptions()  # 创建浏览器对象之前,创建options功能对象
options.add_argument("--headless")  # 添加无界面功能参数
browser = webdriver.Chrome(options=options)  # 构造浏览器对象,打开浏览器

2、Selenium 执行JS脚本

  1. 创建浏览器对象:browser = webdriver.Chrome()
  2. 执行JS脚本:browser.execute_script()
  3. 最常用脚本 - 把滚动条拉到底部:browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
python">from selenium import webdriver

browser = webdriver.Chrome() # 创建浏览器对象
browser.execute_script(
    'window.scrollTo(0,document.body.scrollHeight)'
) # 把滚动条拉到最底部

3、Selenium 设置无界面模式 & 执行JS脚本 案例

3.1 需求分析

基于 Selenium + Chrome 抓取 `http://www.jd.com/` 下 “python书籍” 的信息

3.2 爬虫思路

  1. 打开浏览器输入主页地址:https://www.jd.com/
  2. 使用 Selenium 的 Xpath 找到 信息输入框 和 点击搜索 节点:'//*[@id="key"]' & '//*[@id="search"]/div/div[2]/button'
    在这里插入图片描述
    在这里插入图片描述
  3. 输入 “python书籍” 并点击 点击搜索按钮;
  4. 使用 Selenium 的 Xpath 找到 书籍信息 节点对象列表: '//*[@id="J_goodsList"]/ul/li'在这里插入图片描述
  5. 依次遍历每个元素,并依次提取每本书籍信息;
  6. 爬取完一页信息后,需要判断是否是最后一页
    在这里插入图片描述
    在这里插入图片描述
    可以看到:
    最后一页的节点信息为:pn-next disabled
    非最后一页的节点信息为:pn-next
  7. 如果不是最后一页,点击下一页继续进行爬取:'//*[@id="J_bottomPage"]/span[1]/a[9]'
    在这里插入图片描述

3.3 程序实现

  1. 初始化函数
python">    def __init__(self):
        # 设置为无界面
        self.options = webdriver.ChromeOptions()  # 创建浏览器对象之前,创建options功能对象
        self.options.add_argument('--headless')  # 添加无界面功能参数
        self.driver = webdriver.Chrome(options=self.options)  # 构造浏览器对象,打开浏览器
        self.driver.get(url="http://www.jd.com/")  # 进入主页
        # 搜索框发送:python书籍,点击搜索按钮
        self.inputJD = self.driver.find_element(By.XPATH, '//*[@id="key"]')  # 搜索框xpath://*[@id="key"]
        self.inputJD.send_keys("python书籍")
        self.driver.find_element(By.XPATH,
                                 '//*[@id="search"]/div/div[2]/button').click()  # 搜索按钮xpath://*[@id="search"]/div/div[2]/button 并点击
        time.sleep(1)  # 要给页面元素加载预留时间
  1. 提取数据函数
python">    def parse_html(self):
        """
        function:  具体提取数据方法
              in:  None
             out:  None
          return:  None
          others:  Data Extraction Func
        """
        self.driver.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )  # 先把滚动条拉到最底部,等待所有商品加载完成再进行数据爬取
        time.sleep(3)  # 给页面元素加载预留时间
        # 具体提取数据
        li_list = self.driver.find_elements(By.XPATH,
                                            '//*[@id="J_goodsList"]/ul/li')  # 基准xpath://*[@id="J_goodsList"]/ul/li 每一个商品对应一个li节点
        item = {}  # 定义一个空字典
        for li in li_list:
            item["名称"] = li.find_element(By.XPATH, './/div[@class="p-name"]/a/em').text.strip()
            item["价格"] = li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
            item["评价"] = li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
            item["商家"] = li.find_element(By.XPATH, './/div[@class="p-shopnum"]').text.strip()
            print(item)  # 打印
  1. 程序入口函数
python">    def run(self):
        """
        function:  程序入口函数
              in:  None
             out:  None
          return:  None
          others:  Program Entry Func
        """
        while True:
            self.parse_html()
            # 不是最后一页:pn-next
            # 最后一页:pn-next disabled
            if self.driver.page_source.find("pn-next disabled") == -1:  # 没有找到 pn-next disabled,说明不是最后一页
                self.driver.find_element(By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[9]').click()
                time.sleep(1)
            else:
                self.driver.quit()
                break

3.4 完整代码

python">import time
from selenium import webdriver
from selenium.webdriver.common.by import By


class JDSpider:
    def __init__(self):
        # 设置为无界面
        self.options = webdriver.ChromeOptions()  # 创建浏览器对象之前,创建options功能对象
        self.options.add_argument('--headless')  # 添加无界面功能参数
        self.driver = webdriver.Chrome(options=self.options)  # 构造浏览器对象,打开浏览器
        self.driver.get(url="http://www.jd.com/")  # 进入主页
        # 搜索框发送:python书籍,点击搜索按钮
        self.inputJD = self.driver.find_element(By.XPATH, '//*[@id="key"]')  # 搜索框xpath://*[@id="key"]
        self.inputJD.send_keys("python书籍")
        self.driver.find_element(By.XPATH,
                                 '//*[@id="search"]/div/div[2]/button').click()  # 搜索按钮xpath://*[@id="search"]/div/div[2]/button 并点击
        time.sleep(1)  # 要给页面元素加载预留时间

    def parse_html(self):
        """
        function:  具体提取数据方法
              in:  None
             out:  None
          return:  None
          others:  Data Extraction Func
        """
        self.driver.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )  # 先把滚动条拉到最底部,等待所有商品加载完成再进行数据爬取
        time.sleep(3)  # 给页面元素加载预留时间
        # 具体提取数据
        li_list = self.driver.find_elements(By.XPATH,
                                            '//*[@id="J_goodsList"]/ul/li')  # 基准xpath://*[@id="J_goodsList"]/ul/li 每一个商品对应一个li节点
        item = {}  # 定义一个空字典
        for li in li_list:
            item["名称"] = li.find_element(By.XPATH, './/div[@class="p-name"]/a/em').text.strip()
            item["价格"] = li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
            item["评价"] = li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
            item["商家"] = li.find_element(By.XPATH, './/div[@class="p-shopnum"]').text.strip()
            print(item)  # 打印

    def run(self):
        """
        function:  程序入口函数
              in:  None
             out:  None
          return:  None
          others:  Program Entry Func
        """
        while True:
            self.parse_html()
            # 不是最后一页:pn-next
            # 最后一页:pn-next disabled
            if self.driver.page_source.find("pn-next disabled") == -1:  # 没有找到 pn-next disabled,说明不是最后一页
                self.driver.find_element(By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[9]').click()
                time.sleep(1)
            else:
                self.driver.quit()
                break


if __name__ == '__main__':
    spider = JDSpider()
    spider.run()

3.5 实现效果

在这里插入图片描述


http://www.niftyadmin.cn/n/208411.html

相关文章

Java中Stream的应用

Stream简介 Java 8 版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。 Stream可以由数组或集合创建,对流的操作分为两种: 中间操作:每次返回一个新的…

Linux搭建docker

1. 查看系统的内核版本 [rootwide ~]# uname -r 3.10.0-1160.el7.x86_642. 将yum更新到最新版本 [rootwide ~]# yum upate -y Complete!3. 安装Docker所需的依赖包 [rootwide ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2 Loaded plugins: fastes…

用户界面图形和各种插图网站 UI Graphics

用户界面图形和各种插图网站 UI Graphics 各种格式现代UI资源网站,包括PSD、Sketch、Figma等等,可以为你的UI设计提供各种创意 Github项目地址 Design Resources For Developers WebsiteDescriptionSVG sine waves生成导出完美正弦波的SVG图片UI Design…

仿造问卷星--开发一套调查问卷设计工具(3/3)--完整流程

1,定义一个结果的对象: let resultObj {id: 0,name: "",questions: [], };id,name和questions分别对应问卷id,问卷名称和问卷题目。 2,结果赋值 用户点击生成问卷按钮时, 分别从id和name文本…

UE4/5多人游戏详解(一、基础理论与局域网内部的连接)

目录 多人游戏理论简单讲解 点对点: 于是,服务端和客户端的概念出现了: 局域网连接: 从第三人称c项目开始 创建项目: 以一个客户端作为监听服务器 3个客户端,在场景后方使用服务器: 局…

redis --- AOF(Append Only File)

目录 一、AOF(Append Only File) 1.1、配置AOF 1.1.1、开启AOF 1.1.2、使用默认写回机制,每秒钟 1.1.3、aof文件保存路径 1.1.4、aof文件保存文件名 1.2、验证恢复 1.3、重写机制测试 1.3.1、自动触发 1.3.2、手动触发 一、AOF(Append Only File) 1.1、配…

Redis的MoreKey和BigKey问题

文章目录1、MoreKey案例2、BigKey案例1、MoreKey案例 大批量往Redis里面插入200w测试数据key 在Linux Bash下面执行&#xff0c;插入200w数据 for((i1;i<200*10000;i)); do echo "set k$i v$i">>/root/redisTest.txt;done;使用命令 tail -10 redisTest.t…

牛客过第二遍

1、spring事务管理 Spring事务管理 声明式事务&#xff1a; 1 通过XML配置&#xff0c;声明某方法的事务特征 2、通过注解&#xff0c;声明某方法的事务特征&#xff0c;注解Transactional Transactional 注解参数讲解 isolation &#xff1a;隔离级别&#xff1b;propa…