最新要闻
- 【世界报资讯】何冰:演员没有理解力就只剩大声说话了
- 合金弹头觉醒前期最强阵容搭配推荐
- 【天天热闻】4999元 机械师推出新款创物者X14笔电:RTX2050 4GB独显
- 当前热讯:小米13/13 Pro/13 Ultra三款机型对比:到底怎么选 一目了然
- 【快播报】暴雪承认《暗黑破坏神4》洗点费用有点贵 但不会改
- 沙尘翻过秦岭入川:局地AQI爆表!成都“躲过一劫”
- 天天短讯!雷军现身比亚迪腾势、仰望展台 用小米13 Ultra狂拍
- 世界热门:工信部:将实施5G规模化应用工程 指导发布5G行业建设指南
- 全球时讯:最新持仓浮出水面:百亿级私募左手AI右手“央国企”
- 滚动:蛇怕什么?
- 环球速递!小米之家人山人海!小米13 Ultra销售火爆
- 今日热搜:广告内容“量身定制”!谷歌计划使用生成式AI推送广告
- 天天热门:女子眼球被摘除,竟是痔疮惹的祸!
- 疯狂育儿模式 长达4年半不吃不喝不挪窝:自虐死亡的章鱼图啥?
- 瑞幸咖啡员工称被罚抄写顾客差评 客服回应:对顾客负责
- 天天观察:AMD YES!史上最强核显Radeon 780M首测:《赛博朋克2077》流畅丝滑
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球微头条丨【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具 Selenium 的使用。
(资料图片)
概述
目前,很多网站都采用 Ajax 等技术进行动态加载数据,想要采集这类网站的数据,需要通过抓包对网站的数据接口进行分析,去寻找想要采集的数据由哪个接口传输。而且,就算找到了数据接口,这些接口可能也是被加密过的,想要通过接口获取数据,需要对加密参数进行逆向分析,这个过程对于初学者来说非常复杂。
为了解决这些问题,能够更加简单的进行爬取数据,我们可以使用到一些自动化工具,如 Selenium、playwright、pyppeteer 等,这些工具可以模拟浏览器运行,直接获取到数据加载完成后的网页源码,这样我们就可以省去复杂的抓包、逆向流程,直接拿到数据。
Selenium 的使用
介绍
Selenium 是一个流行的自动化测试框架,可用于测试 Web 应用程序的用户界面。它支持多种编程语言,如Java、Python、Ruby等,并提供了一系列 API,可以直接操作浏览器进行测试。
安装
使用 selenium 首先需要下载浏览器驱动文件,这里以谷歌浏览器为例。在驱动下载页面找到与自己浏览器版本最为接近的文件,如我的谷歌浏览器版本为 112.0.5615.86
,最接近的文件为 112.0.5615.49
,选择此文件,下载对应系统版本的压缩包,将压缩包中的chromedriver.exe程序放到python目录中。因为正常情况下Python在安装时就会被添加到系统环境变量之中,将chromedriver.exe放到Python目录下它就可以在任意位置被执行。
添加好驱动文件后需要安装 Python 的第三方库 selenium。
pip install selenium
使用
Selenium 支持多种浏览器,如谷歌、火狐、Edge、Safari等,这里我们以谷歌浏览器为例。
from selenium import webdriver# 初始化浏览器对象driver = webdriver.Chrome()# 驱动浏览器打开目标网址driver.get("https://www.baidu.com/")# 打印当前页面的源代码print(driver.page_source)# 关闭浏览器driver.quit()
运行代码后我们会发现自动打开了一个浏览器,访问了目标网址,在控制台输出了页面的源代码,然后自动关闭。
Selenium 提供了一系列实用的 Api,通过它我们可以实现更多操作。
元素查找
在之前的文章《解析库的使用》中,我们已经讲到了 Xpath、bs4 这两个库的使用方法,讲到了 Xpath 的路径表达式和 CSS 选择器,因此这里主要讲解定位方法,路径表达式与 CSS 选择器的使用可以去前文中了解。
以京东首页为例,想要获取秒杀栏目的商品信息,我们可以通过多种方法来进行定位。
from selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.jd.com/")# 根据 Xpath 定位goods_xpath = driver.find_elements(By.XPATH, "//div[@class="slider_list"]/div/a[@class="slider_item seckill-item slider_active"]")# 根据 Css 选择器定位goods_css = driver.find_elements(By.CSS_SELECTOR, "a[class="slider_item seckill-item slider_active"]")# 根据类名定位goods_class_name = driver.find_elements(By.CLASS_NAME,"seckill-item")print(goods_xpath)for goods in goods_xpath: # 输出节点的文本信息 print(goods.text) driver.quit()# [
除了示例代码中的,还有其它定位方法:
driver.find_elements(By.ID,"ID")driver.find_elements(By.LINK_TEXT,"LINK_TEXT")driver.find_elements(By.PARTIAL_LINK_TEXT,"PARTIAL_LINK_TEXT")driver.find_elements(By.TAG_NAME,"TAG_NAME")
元素交互
Selenium 可以实现对页面中元素的点击、输入等操作。
想要采集京东的指定商品信息,首先需要在输入框输入商品名称,然后点击搜索按钮,网页就会跳转到搜索页面,展示我们搜索的商品信息。这个流程我们也可以通过 Selenium 来模拟实现。
driver.get("https://www.jd.com/")# 获取搜索框search = driver.find_element(By.XPATH,"//div[@role="serachbox"]/input")# 获取查询按钮button = driver.find_element(By.XPATH,"//div[@role="serachbox"]/button")# 在搜索框中输入 Pythonsearch.send_keys("Python")# 点击查询按钮button.click()
等待
在我们使用 Selenium 时会遇到以下两种情况:
- 页面未加载完毕,但是我们需要的元素已经加载完毕
- 页面加载完毕,但是我们需要的元素为加载完毕
Selenium 的 get 方法是默认等待页面加载完毕后再执行下面的操作。在遇到第一种情况时,要采集的数据已经生成了,但是可能由于某个资源加载缓慢导致页面一直在加载中状态,这样 Selenium 就会一直等待页面完全加载,造成采集速度缓慢等问题。而情况二,页面已经加载完成了,但是要采集的数据依旧没有渲染出来,这就使 Selenium 定位元素失败导致程序异常。为了避免解决这两种情况,我们可以设置不等待页面完全加载,只等待目标元素加载完毕。
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiescaps = DesiredCapabilities().CHROME#不等待页面加载caps["pageLoadStrategy"] = "none"driver = webdriver.Chrome(desired_capabilities=caps)
强制等待
使用 time.sleep() 实现强制等待。不推荐使用。
driver.get("https://www.jd.com/")# 强制休眠6秒time.sleep(6)
隐式等待
等待页面加载的时间,当页面加载完成后执行下一步,如果加载时间超过设置的时间时直接执行下一步。不推荐使用。
# 隐式等待10秒driver.implicitly_wait(10)driver.get("https://www.jd.com/")
显式等待
等待条件满足后执行下一步,条件不满足则一直等待,当超过设置的时间时抛出异常。推荐使用。
from selenium import webdriverimport selenium.common.exceptionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()driver.get("https://www.jd.com/")try: WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located( (By.CSS_SELECTOR, "a[class="slider_item seckill-item slider_active"]") ) )except selenium.common.exceptions.TimeoutException: print("元素加载超时")
当 CSS 选择器指向的元素存在时则执行下一部,不存在则继续等待,直到超过设置的10秒,抛出超时异常。
Actions
上文中讲到了元素交互,其中点击、输入行为都是属于 Selenium 的动作 Api 之中的,除此之外,Selenium还提供了非常丰富的动作 Api,这里只介绍常用的方法。
鼠标操作
from selenium.webdriver import ActionChains# 单击元素并按住clickable = driver.find_element(By.ID, "clickable")ActionChains(driver).click_and_hold(clickable).perform()# 双击,将鼠标移动到元素中心并双击clickable = driver.find_element(By.ID, "clickable")ActionChains(driver).double_click(clickable).perform()# 按偏移量移动鼠标mouse_tracker = driver.find_element(By.ID, "mouse-tracker")ActionChains(driver).move_to_element_with_offset(mouse_tracker, 8, 0).perform()# 按当前指针位置进行偏移,如之前没有移动鼠标,则默认在窗口的左上角。(13, 15)为横纵坐标的偏移值,13为向右移动13,15为向下移动15,负数则反之。ActionChains(driver).move_by_offset( 13, 15).perform()# 按偏移拖放。点击元素并按钮,移动指定偏移量,然后释放鼠标draggable = driver.find_element(By.ID, "draggable")start = draggable.locationfinish = driver.find_element(By.ID, "droppable").locationActionChains(driver).drag_and_drop_by_offset(draggable, finish["x"] - start["x"], finish["y"] - start["y"]).perform()
滚轮
# 滚动到指定元素iframe = driver.find_element(By.TAG_NAME, "iframe")ActionChains(driver).scroll_to_element(iframe).perform()# 按给定值滚动,(0, delta_y) 为向右和向下滚动的量,负值则反之。footer = driver.find_element(By.TAG_NAME, "footer")delta_y = footer.rect["y"]ActionChains(driver).scroll_by_amount(0, delta_y).perform()
反检测
Selenium 有着非常明显的缺陷,就是容易被网站检测到。我们通过 Selenium 打开网页时会发现,窗口上方会显示浏览器正受到自动测试软件的控制,这就说明 Selenium 驱动浏览器与用户正常打开浏览器是不同的,它存在着许多 WebDriver 的特征,网站可以通过检测这些特征来禁止 Selenium 访问。
我们可以通过一些特征值检测的网站来对比正常访问与 Selenium 访问的区别。
上面是正常访问,下面是 Selenium 访问,可以很清晰的看到 WebDriver 一栏标红了,这就说明 Selenium 被检测到了。网站的检测原理主要是通过检查 window.navigator 对象中是否存在 webdriver 属性。我们了解到这一点后,可以通过一些操作来修改window.navigator 对象,在页面未加载时将它的 webdriver 属性设置为 false,这样或许就能避开网站的检测机制。
from selenium import webdriverfrom selenium.webdriver import ChromeOptionsoptions = ChromeOptions()# 以最高权限运行options.add_argument("--no-sandbox")# navigator.webdriver 设置为 falseoptions.add_argument("--disable-blink-features=AutomationControlled")# 隐藏"Chrome正在受到自动软件的控制"提示options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option("useAutomationExtension", False)driver = webdriver.Chrome(options=options)with open("./stealth.min.js", "r") as f: js = f.read()driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js})
可以看到,我们进行了一些隐藏特征的操作,但在最后我们读取一个文件,然后将这个文件信息传入到了execute_cdp_cmd()方法中,这个操作其实也是在隐藏特征。
stealth.min.js 来自于 puppeteer 的一个插件,puppeteer 是一个控制 headless Chrome 的 Node.js API ,puppeteer 有一个插件名为 puppeteer-extra-plugin-stealth,它的开发目的就是为了防止 puppeteer 被检测,它可以隐藏许多自动化特征。puppeteer-extra 的作者也编写了一个脚本,用于将最新的特征隐藏方法puppeteer-extra-stealth 提取到 JS 文件之中,生成的 JS 文件可以用于纯 CDP 实现,也可以用于测试开发工具中的检测规避。而 Selenium 正好支持 CDP 的调用,CDP 全称(Chrome DevTools Protocol),利用它可以在浏览器加载之前执行 JS 语句。
如果你已经安装了 node.js ,npx extract-stealth-evasions
执行此命令就可以生成 stealth.min.js 文件。下图就隐藏特征后访问结果。
无头模式
无头模式下网站运行不会弹出窗口,可以减少一些资源消耗,也避免了浏览器窗口运行时对设备正常使用带来的影响,在服务器上运行需要用到。但是无头模式下被网站检测的特征点非常多,因此需要根据自己的应用场景来使用。
options = ChromeOptions()options.add_argument("--headless")driver = webdriver.Chrome(options=options)
总结
使用 Selenium 来进行数据的爬取是一种优势与劣势都非常明显的选择。它的优势就是简单,不需要对网站进行调试,不需要关注数据的来源,大大减少了爬虫程序的开发时间。它的劣势有多种:采集效率低,资源占用大,不稳定,容易被检测,且需要依赖于 WebDriver,当浏览器更新后就需要更新对应的 WebDriver。因此 Selenium 适用于那些逆向难度较大,且对采集效率要求不高的场景。
关键词:
-
焦点精选!易基因:MeRIP-seq等揭示m6A甲基化修饰对抗病毒基因表达的转录调控机制|Cell Rep
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2021年03月02日,杜克大学医学中心的...
来源: 环球微头条丨【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用
焦点精选!易基因:MeRIP-seq等揭示m6A甲基化修饰对抗病毒基因表达的转录调控机制|Cell Rep
关注:深度学习--PyTorch维度变换、自动拓展、合并与分割
【环球新要闻】记录-JS简单实现购物车图片局部放大预览效果
创建本地yum仓库
【世界报资讯】何冰:演员没有理解力就只剩大声说话了
合金弹头觉醒前期最强阵容搭配推荐
【天天热闻】4999元 机械师推出新款创物者X14笔电:RTX2050 4GB独显
当前热讯:小米13/13 Pro/13 Ultra三款机型对比:到底怎么选 一目了然
【快播报】暴雪承认《暗黑破坏神4》洗点费用有点贵 但不会改
沙尘翻过秦岭入川:局地AQI爆表!成都“躲过一劫”
天天短讯!雷军现身比亚迪腾势、仰望展台 用小米13 Ultra狂拍
世界热门:工信部:将实施5G规模化应用工程 指导发布5G行业建设指南
全球时讯:最新持仓浮出水面:百亿级私募左手AI右手“央国企”
【天天播资讯】Natasha Preheating(三)
全球新动态:集合 第二天
环球今热点:24道Python面试练习题
Kubesphere-DevOps-记一次流水线排错
新起点!大数据分布式可视化的 DAG 任务调度系统 Taier 正式发布1.4版本
滚动:蛇怕什么?
环球速递!小米之家人山人海!小米13 Ultra销售火爆
今日热搜:广告内容“量身定制”!谷歌计划使用生成式AI推送广告
天天热门:女子眼球被摘除,竟是痔疮惹的祸!
疯狂育儿模式 长达4年半不吃不喝不挪窝:自虐死亡的章鱼图啥?
瑞幸咖啡员工称被罚抄写顾客差评 客服回应:对顾客负责
天天观察:AMD YES!史上最强核显Radeon 780M首测:《赛博朋克2077》流畅丝滑
当前观察:2023年医保新规如何给家人用?医保卡新规2023一家人用可以吗?
全球短讯!k8s介绍与常用命令
我替 OpenAI 实现了 ChatGPT 聊天记录复制功能
天天讯息:ubuntu编译字符设备
今日热门!咨询chatGPT关于c#脚本的方案,全文无任何修改。
天天通讯!GIS在电力管理中的应用
央行:我国不存在长期通缩或通胀的基础
观焦点:新华社权威快报|5G基站超264万个 我国数字化基础不断夯实
天天微动态丨汽车厂商要登月!现代联手科研机构开发探月机器人
当前播报:俄罗斯开发者拿到钱了 显卡超频神器Afterburner恢复更新:等了1年半
环球热消息:斯柯达研发新EA211系列发动机:全新帕萨特、速派等50车搭载
人类最强火箭!SpaceX星舰今晚重新发射:目前系统一切正常
天天热议:宝马MINI的冰淇淋只配老外吃:高管刚表示BMW家在中国
“零工市场”为灵活就业“添翼续航”
“4.5%”彰显中国经济的韧性和活力
“中国车企加速迈向电动化,将国际老牌车企甩在身后”
环球新动态:IDEA编译Spring源码教程
微资讯!使用etcd实现Master的选举功能
Rust 知识积累(6)
当前快播:【Jmeter】Request1输出作为Request2输入-后置处理器
世界热文:详解数据结构中栈的定义和操作
通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
张颂文用小米13 Ultra拍照!网友建议加上水印
【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
长达10年维护落幕:微软提醒Office 2013已停止支持
当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
联想刘军:今年将是大客户市场的 “大年”
浑厚悠扬!三号楼的钟声……
每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
全球快资讯:springboot 中使用 RabbitMQ 配置使用优先级队列
查看Unity3D中默认的变量名与按键的映射
时隔6年后,我又回到博客园了
环球看点!更新整理了一大波热门免费可用的API大全
微动态丨ChatGPT闲谈——火出圈的为什么是 OpenAI?
新消息丨微软苏菲要换代了!Surface Pro 10/Go 4新品曝光:外形/配置大变
【环球报资讯】最新研究:黄河上游区域性干旱能“算来”
这个火车站客流暴增,原因竟是……
全球信息:雪莲子的功效与副作用 雪莲子的功效与作用及食用方法
世界播报:真我11系列拍摄样张首秀:长焦恐怖 可见月亮纹理
【热闻】没人比我更懂外星人?马斯克:如果找到外星人 我立马发推
环球热资讯!ZV-E10同款传感器:索尼FX10视频机即将发布
环球快资讯:熊孩子躲袋子里玩误被司机碾压 路人合力抬车救援:网友吐槽家长心大
环球速看:一大众轿车高速路恶意别车!S形行驶10公里:官方已介入调查
每日焦点!诺诚健华宣布奥布替尼成为中国首个且唯一获批针对边缘区淋巴瘤的BTK抑制剂
田园变游园
中国联通跌5.6% 民生证券在其年内高点推荐
全球简讯:再获殊荣!华为云GaussDB喜提“科技进步一等奖”
当前最新:开发者必读!常用的二维码生成器 API 推荐
第六章 面向对象编程
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球讯息:JavaScript 九九乘法表
每日快看:墨水人_墨水
即时:今日描写冬季的古诗名句_描写冬季的古诗
仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
进程处于临界区是什么状态?进程处于临界区可以调度吗?
iu14D2N.tmp是什么意思?iu14D2N.tmpiu14D2N.tmp可以删除吗?
miui开发版内测和公测哪个好?miui开发版内测更新频率是多长时间?
拆机版单反是什么意思?拆机版单反与套机的区别是什么?
苹果IPAD用哪个助手好?苹果ipad型号大全及价格表
当前速读:后台性能测试规范
世界聚焦:福建省练习题
Oracle 备忘清单_开发速查表分享
环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
到2028年AIoT平台市场价值249亿美元
环球速讯:前端跨域解决方案——JSONP