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

news2024/9/29 15:33:18

此篇文章主要介绍如何使用 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 实现效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/852905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SciencePub学术 | 传感器类重点SCIE征稿中

SciencePub学术 刊源推荐: 传感器类重点SCIE征稿中!信息如下,录满为止: 一、期刊概况: 传感器类重点SCIE 【期刊简介】IF:2.0-2.5,JCR3区,中科院4区; 【版面类型】正刊&#xff1…

【UE4 RTS】03-Camera Zoom

前言 本篇通过对CameraPawn的弹簧臂组件的长度进行增减,从而实现了视角的远近缩放控制。 效果 步骤 1. 在项目设置中添加如下操作映射 2. 打开玩家控制器“RTS_PlayerController_BP”,在上一篇中我们已经实现了CameraPawn的移动功能: 这里…

OpenLayers实战,OpenLayers实现气象台风飓风运动轨迹运动动画,可调台风旋转速度和运动速度,静态图片旋转动画

专栏目录: OpenLayers实战进阶专栏目录 前言 本章使用OpenLayers实现气象中常用的台风或者飓风运动轨迹动画,支持调整台风图标旋转速度和运动速度。 不同的台风可以设置不同的运动速度和旋转速度,也可以通过变量控制图片不旋转。 本章图片使用静态png图片,并非gif动态图。…

棒球电影产业建设·野球1号位

棒球电影产业建设 1. 引言 棒球电影产业在美国和全球的历史发展概述 自20世纪初,棒球电影产业在美国开始起步,以一种富有创意的方式将体育和娱乐结合起来,开创了一种全新的娱乐形式。这些电影为观众提供了一个了解棒球运动的独特视角&#…

FFmpeg 硬编码VideoToolBox流程

介绍 FFmpeg已经提供对 VideoToolBox 的编解码支持;主要涉及到的文件有videotoolbox.c、videotoolbox.h、videotoolboxenc.c、ffmepg_videotoolbox.c。在编译 FFmpeg 源码时,想要支持VideoToolBox,在 configure 时,需要–enable-…

SMART司马他法则(目标管理)

S代表具体(Specific),指绩效考核要切中特定的工作指标,不能笼统; M代表可度量(Measurable),指绩效指标是数量化或者行为化的,验证这些绩效指标的数据或者信息是可以获得的; A代表可实现(Attainable)&…

CSV文件编辑器——Modern CSV for mac

Modern CSV for Mac是一款功能强大、操作简单的CSV文件编辑器,适用于Mac用户快速、高效地处理和管理CSV文件。Modern CSV具有直观的用户界面,可以轻松导入、编辑和导出CSV文件。它支持各种功能,包括排序、过滤、查找和替换,使您能…

1.RuoYi-Vue前后端分离版本启动

1.代码下载 去若依官网,选择RuoYI前后端分离版: 下载地址:https://gitee.com/y_project/RuoYi-Vue 2.依赖环境的部署 1.Mysql 2.Redis安装部署 : https://blog.csdn.net/qq_27860623/article/details/132168382 3.Idea打开后端服务 用Idea打开后端的…

隐秘通信-使用PingTunnel搭建ICMP隧道实验

目录 引言 实验目的 实验内容 基础知识 ICMP协议简介 ICMP隧道简介 ICMP隧道搭建工具介绍 PingTunnel简介 实验过程 前置准备 PingTunnel搭建ICMP隧道步骤 CentOS 7更换阿里源 CentOS 7安装make及词法分析工具 CentOS 7安装libpcap依赖库 CentOS 7安装PingTunnel…

Scikit-learn聚类方法代码批注及相关练习

一、代码批注 代码来自:https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py import numpy as np from sklearn.cluster import DBSCAN from sklearn import metrics from sklearn.datasets …

机器学习深度学习——RNN的从零开始实现与简洁实现

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——循环神经网络RNN 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮…

php后端实现调用高德地图进行POI搜索

对于当前位置或者选定省市位置进行查询 接口实现 /*** 查询地址* ApiTitle (查询地址)* ApiSummary (查询地址)* ApiMethod (POST)* ApiRoute (/api/demo/address)* ApiParams (name"dart", type"integer", requiredtrue, description"省…

项目经理的性格与情绪控制︱小象智能COO、原腾讯项目集管理经理王炼

小象智能COO、原腾讯项目集管理经理王炼女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:项目经理的性格与情绪控制。大会将于8月12-13日在北京举办,敬请关注! 议题简要: 众所周知,项…

光模块故障:能否继续发射光信号?

光模块是一种关键的光通信组件,负责将电信号转换为光信号进行传输。然而,光模块也可能出现故障,导致其无法正常工作。那么,如果光模块坏了,是否还能发射光信号呢?本文将探讨光模块故障对光信号发射的影响&a…

【ArcGIS】经纬度数据转化成平面坐标数据

将点位置导入Gis中,如下(经纬度表征位置): 如何利用Gis将其转化为平面坐标呢? Step1 坐标变换 坐标变换,打开ArcToolbox,找到“数据管理工具”->“投影和变换”->“要素”->“投影”…

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流

临云镜全景相机是阿里巴巴定制全景设备,实现空间三维信息的快速采集,与阿里云三维空间重建平台搭配,帮助品牌商与平台以较低的成本完成空间的快速采集,并支持对室内/室外空间的三维全景展示及空间漫游,同时支持VR浏览、…

论文图表--pyecharts使用

python中使用matplotlib画图颜色不好看,所以选取了pyecharts来画图表。 echarts介绍 pyecharts是echarts的python接口,echarts本身是基于javascript的,由于javascript搭建也比较麻烦,这里使用pyecharts来画图。 echarts常用来pp…

语音同声翻译软件到底谁更胜一筹呢

嘿!你是否曾经遇到过需要在不同语言之间进行实时翻译的情况?别担心,现在有许多翻译软件可供选择,让你的沟通变得更加简便和愉快。无论你是旅行者、国际商务人士还是语言爱好者,这些软件都将成为你的得力助手&#xff0…

PyQt学习笔记-Windows系统版本兼容问题踩坑记录

1 Pyinstaller打包的exe在Win10上可以使用&#xff0c;在Win7上缺提示找不到dll。 错误信息&#xff1a; Traceback (most recent call last): File "main.py", line 4, in <module> ImportError: DLL load failed while importing QtWidgets: 找不到指定的…

Beautiful Sequence 2023牛客暑期多校训练营7 C

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;给出一长度n-1的数组b&#xff0c;要求构造一个长度为n的数组a&#xff0c;满足a[i]^a[i1]b[i]&#xff0c;a[i]<a[i1]&#xff0c;求字典序第k小的数组 1<n<1e6;0<a[i],b[i]< 思路&#xff1a;因为…