selenium简介、使用selenium爬取百度案例、selenium窗口设置、

news/2024/5/19 17:36:31

1 selenium简介
2 使用selenium爬取百度案例
3 selenium窗口设置

1 selenium简介

'''
【一】web自动化
随着互联网的发展,前端技术也在不断变化,数据的加载方式也不再是单纯的服务端渲染了。
现在你可以看到很多网站的数据可能都是通过接口的形式传输的,
或者即使不是接口那也是一些 JSON 的数据,然后经过 JavaScript 渲染得出来的。
这时,如果你还用 requests 来爬取内容,那就不管用了。
因为 requests 爬取下来的只能是服务器端网页的源码,这和浏览器渲染以后的页面内容是不一样的。
因为,真正的数据是经过 JavaScript 执行后,渲染出来的,数据来源可能是 Ajax,也可能是页面里的某些 Data,或者是一些 ifame 页面等。
不过,大多数情况下极有可能是 Ajax 接口获取的。
所以,很多情况我们需要分析 Ajax请求,分析这些接口的调用方式,通过抓包工具或者浏览器的“开发者工具”,找到数据的请求链接,然后再用程序来模拟。
但是,抓包分析流的方式,也存在一定的缺点。
因为有些接口带着加密参数,比如 token、sign 等等,模拟难度较大;
那有没有一种简单粗暴的方法,
这时 Puppeteer、Pyppeteer、Selenium、Splash 等自动化框架出现了。
使用这些框架获取HTML源码,这样我们爬取到的源代码就是JavaScript 渲染以后的真正的网页代码,数据自然就好提取了。
同时,也就绕过分析 Ajax 和一些 JavaScript 逻辑的过程。
这种方式就做到了可见即可爬,难度也不大,同时适合大批量的采集。
【二】Selenium
作为一款知名的Web自动化测试框架,支持大部分主流浏览器,提供了功能丰富的API接口,常常被我们用作爬虫工具来使用。
然而selenium的缺点也很明显
速度太慢
对版本配置要求严苛
最麻烦是经常要更新对应的驱动
selenium最初是一个自动化测试工具,
而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,
比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
'''
【一】使用selenium需要安装第三方框架包
pip install selenium【二】chorme驱动
http://chromedriver.storage.googleapis.com/index.html?path=114.0.5735.90/
https://googlechromelabs.github.io/chrome-for-testing/#stable
下载并解压 ---> chromedriver.exe# 复制到当前文件夹下from selenium import webdriver
import time# 实例化得到一个 chrome 对象
browser = webdriver.Chrome()# 调用 browser 对象打开网页
browser.get('https://www.baidu.com/')time.sleep(10)# 这里点击代码运行后发现没有调用浏览器并且控制台无反应,夯住了
# 原因是因为 selenium 第一次调用 驱动的时候会很慢

2 使用selenium爬取百度案例

from selenium import webdriver
from selenium.webdriver.common.by import By
from fake_useragent import UserAgentclass BaseBrowser:def __init__(self):self.browser = webdriver.Chrome()self.headers = {'User-Agent': UserAgent().random}class SpiderBaidu(BaseBrowser):def __init__(self):super(SpiderBaidu, self).__init__()self.index_url = 'https://www.baidu.com/'def spider_baidu_index(self):# 1.打开百度首页self.browser.get(self.index_url)# 2.解析页面数据抓取页面数据# 【二】解析页面数据抓取页面数据# 【1】css选择器# find_element :类似于 find 只能招一个标签# self.browser.find_element()# find_elements : find_all 找很多个标签# self.browser.find_elements()# 以前是 tree ---> xpath# soup ---》 css'''find_elements 里面有一个参数 叫 byfrom selenium.webdriver.common.by import By一共有以下几种选择器ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"'''# li_list = self.browser.find_elements(By.CSS_SELECTOR, '#hotsearch-content-wrapper > li')# print(li_list)# 2)xpath语法li_list = self.browser.find_elements(By.ID, 'hotsearch-content-wrapper')print(li_list)if __name__ == '__main__':s = SpiderBaidu()s.spider_baidu_index()

3 selenium窗口设置


'''注意:把驱动chromedriver.exe放在你的环境变量(python解释器),这样可以直接初始化页面
'''import random# 【一】驱动位置的问题
# 确保你有驱动并且,在当前路径下最好
# 可以放到在系统环境变量中存在的指定的路径下
# 我将驱动添加到了 Python解释器路径下tag_url = 'https://www.baidu.com/'
from selenium import webdriver
import timebrowser = webdriver.Chrome()browser.get(tag_url)def sleep_time():time.sleep(random.randint(1, 3))# 【二】访问页面
# 浏览器对象.get(目标地址) ---> 打开网页
# 浏览器.close() ---> 关闭浏览器窗口# 【三】设置当前浏览器窗口的大小# 设置当前浏览器的窗口
browser.set_window_size(400,400)
# 打开窗口至全屏
browser.maximize_window()# 【四】前进和后退browser.get('https://www.baidu.com')
sleep_time()browser.get('https://www.jd.com/')
sleep_time()# 回退到百度页面
browser.back()
sleep_time()# 回到京东页面
browser.forward()
sleep_time()# 关闭浏览器
browser.close()# 【五】获取当前浏览器的基础属性
browser.get(tag_url)# 网页标题
print(browser.title)
# 百度一下,你就知道# 网页的当前网址
print(browser.current_url)
# https://www.baidu.com/# 当前浏览器的名称
print(browser.name)
# chrome# 查看网页的源码
print(browser.page_source)
# 我正常通过 requests 模块携带 UA 请求过返回的响应的页面源码数据# 【六】切换选项卡
browser.get(tag_url)
sleep_time()# 打印当前浏览器的句柄对象
print(browser.window_handles)
# ['73FE2519DFCC0953B45DC3094C835139']# 控制selenium 在当前窗口打开一个新的窗口
# 执行js代码
browser.execute_script('window.open("https://www.jd.com/")')
sleep_time()# 切换当前窗口至另一个窗口
# 当前浏览器的句柄对象
all_handles = browser.window_handles
print(all_handles)browser.switch_to.window(all_handles[0])
sleep_time()# 再打开新的网页
browser.get('https://pic.netbian.com/')
sleep_time()

http://www.mrgr.cn/p/82768447

相关文章

css多行文本控制行数溢出显示省略号

height: auto; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; /* 控制显示的行数 */ overflow: hidden; text-overflow: ellipsis; 效果:

Jmeter调用java代码

加密:MD5、Base64、SHA、RSA、签名 混合加密: jmeter的md5加密函数:BeanShell 调用java代码: 调用jar包: 1)在测试计划中引入jar包2)调用代码

【yolov8】yolov8剪枝训练流程

yolov8剪枝训练流程 流程: 约束剪枝微调 一、正常训练 yolo train model./weights/yolov8s.pt datayolo_bvn.yaml epochs100 ampFalse projectprun nametrain二、约束训练 2.1 修改YOLOv8代码: ultralytics/yolo/engine/trainer.py 添加内容&#…

一文读懂 YUV 的采样与格式

转载自:https://cloud.tencent.com/developer/article/1442041YUV 是一种颜色编码方法,和它等同的还有 RGB 颜色编码方法。 RGB 颜色编码 RGB 三个字母分别代表了 红(Red)、绿(Green)、蓝(Blue),这三种颜色称为 三原色,将它们以不同的比例相加,可以产生多种多样的颜…

Appium Inspector与Weditor:移动端测试的利器

简介 元素定位工具是在软件开发和自动化测试中精确定位和操作用户界面元素的工具。元素定位工具可以提供辅助定位元素、编写代码、录制用例、调试代码等功能。在移动端应用的自动化测试中,一款灵活的元素定位工具是必不可缺的,本节推荐两种定位工具,分别为官网提供的 Appium…

Learning C# Programming with Unity 3D

作者:Alex Okita 源码地址:GitHub - badkangaroo/UnityProjects: A repo for all of the projects found in the book. 全书 686 页。

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode) 合并两个有序链表我们的思路是创建一个新链表,然后遍历已知的两个有序链表,并比较其节点的val值,将小的尾插到新链表中,然后继续遍历,直到将该两个链表…

uniapp开发小程序引入vant

1. 安装 # 通过 npm 安装 npm i @vant/weapp -S --production# 通过 yarn 安装 yarn add @vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production2. 引入项目首先在项目根目录创建文件夹 wxcomponents ,然后在其中创建 vant 文件夹。 把node_modules中的v…

Redis高级-分布式缓存

分布式缓存 – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.Redis持久化 Redis有两种持久化方案: RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件)&#xf…

QT作业1

1、思维导图 2、 自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 头文件&#xff1a; #ifndef MUSIC1_H #define MUSIC1_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QIcon>…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

【LeetCode刷题记录】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,1…

Reflection: Cast IEnumerableT to runtime type

https://stackoverflow.com/questions/44546513/cast-ienumerablet-to-runtime-type 本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/keeplearningandsharing/p/18176925

Windows 10 LTSC启用Microsoft Store的方法

新建msreg.bat文件,并编辑内容如下: ========== @echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\sys…

瑞芯微RK3588 MIPI CSI接6路imx464驱动

瑞芯微RK3588最高支持6路mipi camera&#xff0c;此篇分享下如何接入6路imx464 我们使用2 MIPI DCPHY 4 MIPI CSI DPHY(2 lanes)这个配置。 首先就是dts配置 // SPDX-License-Identifier: (GPL-2.0 OR MIT) /** Copyright (c) 2021 Rockchip Electronics Co., Ltd.**/&c…

vue2实现右键菜单功能——vue-diy-rightmenu——基础积累

五一之前遇到一个需求&#xff0c;就是关于要实现自定义右键菜单的功能&#xff0c;普通的右键展示的菜单有【返回/前进/重新加载/另存为】等&#xff0c;希望实现的效果就是右键出现自定义的菜单&#xff0c;比如【编辑/删除/新增】等。 遇到这种的需求&#xff0c;可以直接去…

(done) LSTM 详解 (包括它为什么能缓解梯度消失)

RNN 参考视频&#xff1a;https://www.bilibili.com/video/BV1e5411K7oW/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 LSTM 参考视频&#xff1a;https://www.bilibili.com/video/BV1qM4y1M7Nv?p5&vd_source7a1a0bc74158c6993c7355c5…

Pytorch入门—Tensors张量的学习

pytorch入门Tensors张量的学习记录。Tensors张量的学习 张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量来编码模型的输入和输出,以及模型的参数。 张量类似于NumPy的ndarrays,只是张量可以在GPU或其他硬件加速器上运行。事实上,张量和NumPy数组…

sql 存储过程proc中的参数 是 @details 表值 参数类型的时候,如何如何查看 自定义表的 表结构和字段信息

if 数据库工具 是 sqlserver2008 R2 去安装一个 sql prompt 就行了,鼠标放上去会自动提示 表结构信息 else

Java特性之设计模式【享元模式】

一、享元模式 概述 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式 享元模式尝试重用现有的同类对…