基于Selenium模块实现无界面模式 & 执行JS脚本

这篇具有很好参考价值的文章主要介绍了基于Selenium模块实现无界面模式 & 执行JS脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1、Selenium 设置无界面模式

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

browser = webdriver.Chrome(options=options)

from selenium import webdriver

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

2、Selenium 执行JS脚本

创建浏览器对象:browser = webdriver.Chrome()
执行JS脚本:browser.execute_script()
最常用脚本 - 把滚动条拉到底部:browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
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 爬虫思路
打开浏览器输入主页地址:https://www.jd.com/
使用 Selenium 的 Xpath 找到 信息输入框 和 点击搜索 节点:'//*[@id="key"]' & '//*[@id="search"]/div/div[2]/button'

输入 “python书籍” 并点击 点击搜索按钮;
使用 Selenium 的 Xpath 找到 书籍信息 节点对象列表: '//*[@id="J_goodsList"]/ul/li'; 
依次遍历每个元素,并依次提取每本书籍信息;
爬取完一页信息后,需要判断是否是最后一页

可以看到:
最后一页的节点信息为:pn-next disabled
非最后一页的节点信息为:pn-next
如果不是最后一页,点击下一页继续进行爬取:'//*[@id="J_bottomPage"]/span[1]/a[9]'

3.3 程序实现

初始化函数
    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

3.4 完整代码

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 实现效果

基于Selenium模块实现无界面模式 & 执行JS脚本,自动化测试,Web自动化,selenium,javascript,测试工具

 文章来源地址https://www.toymoban.com/news/detail-637790.html

到了这里,关于基于Selenium模块实现无界面模式 & 执行JS脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作

    在 Selenium 模块中,提供了一个 Keys 类,来处理键盘操作; 在 Selenium 模块中,使用 send_keys() 方法,来模拟键盘输入, 此篇文章主要介绍如何使用 Keys 类 和 send_keys() 方法 实现 模拟键盘操作,并以具体的示例进行展示。 Keys类键盘事件 实现功能 Keys.BACK_SPACE 删除键 Keys.SPACE 空

    2023年04月09日
    浏览(86)
  • Selenium执行Javascript脚本使用参数和返回值

    在Selenium中可以使用drvier.execute_script()来执行Javascript脚本,支持多行语句。 使用Javascript可以实现以下功能: 移除元素隐藏、禁用、只读等限制属性 为元素添加id或高亮样式 页面滚动 富文本框输入(HTML注入) 获取页面信息 在使用Javascript语句时,还可以动态传入参数或元素对

    2024年02月06日
    浏览(40)
  • 基于selenium实现多个脚本只打开一次浏览器(重复使用浏览器)

    本文思路来源【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)_是小菜欸的博客-CSDN博客 selenium 自动打开Chrome浏览器且重复使用已打开的Chrome实例_飞扬的箭的博客-CSDN博客 但是这一篇文章的方式对于我来说有一个缺点,即每一次都需要新创建一个浏览器,或者需要

    2024年02月16日
    浏览(27)
  • 【Web自动化测试】(七)Selenium中执行JavaScript脚本

    相关文章链接: 【Web自动化测试】(一)Selenium介绍及安装部署说明 【Web自动化测试】(二)使用selenium编写测试用例 【Web自动化测试】(三)Selenium中控件定位方法 【Web自动化测试】(四)Selenium中WEB控件交互的方法 【Web自动化测试】(五)Selenium中的三种等待方式 【We

    2024年02月04日
    浏览(29)
  • 渗透测试——python脚本(selenium模块)暴力破解

    免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 背景:实习的第二个周的第二个评估网站项目,很明显,这里没有验证码(有验证码的情况也可以用这个方法,具

    2024年02月02日
    浏览(27)
  • python脚本——selenium自动化执行一些网页上的操作

    通过python的selenium模块,自动化执行一些网页上的重复的无聊的工作。 chromdriver下载地址

    2024年02月13日
    浏览(44)
  • rabbitMQ~工作模式代码实现【基于python pika模块】

    1 简单模式 2 工作模式 3 发布订阅模式 4 路由模式 5 主题模式

    2024年01月23日
    浏览(77)
  • 100天精通Python(实用脚本篇)——第116天:基于selenium实现反反爬策略之添加cookie登录网站

    🔥🔥 本文已收录于 《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html 优点 : 订阅限时9.9付费专

    2024年02月20日
    浏览(39)
  • 100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

    🔥🔥 本文已收录于 《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html 优点 : 订阅限时9.9付费专

    2024年03月19日
    浏览(32)
  • 基于node.js中的serialport模块实现无线传感网上位机功能

    半个月前的无线传感网课设上位机的实现遇到了很多困难,特写此文章给有需要的朋友一些帮助,欢迎私信探讨 本文所要实现的功能以及使用到的技术栈 功能 :根据课设要求,当协调器收到信息时,我要解析收到的数据,动态显示出拓扑图,当点击拓扑图节点时,显示该节

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包