python优雅地爬虫
申明:仅用作学习用途,不提供任何的商业价值。
背景
我需要获得新闻,然后tts,在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路:获得html内容-> python的工具库解析,获得元素中的内容,完成。

好家伙,我知道我爬取失败了。一堆js代码,看得我烦。我一去看页面发现:原来新闻的获得是走的接口,然后js插入文档的,于是啃接口。
又被难住了!接口的pageCallback是什么,感觉我的经验,这个是复杂的js加密之后的,因为没有带这个参数,可以轻易的通过接口获得想要的数据。

假如没有这个参数,我其实可以为所欲为了。所以,分析pageCallback这个参数的加密非常耗时间了。也不打算研究,我决定换一种方式去研究。

拿出我的终极大招:Selenium。模拟用户的操作,该不会拦截我吧。
爬虫2.0
使用Selenium模拟用户爬取页面内容,并输出成文件。关于Selenium是什么,欢迎看这篇文章:selenium Python教程。在这里,我只讲我主要的实现。
首先作为一款工具脚本,我们应该不喜欢窗口界面吧,除非你需要动态的观察程序的操作。所以,我开启了无头浏览器模式。
# 无头浏览器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
关键的driver拿到之后,剩下的过程就简单了。和一般的requests、spider爬虫一样,需要获得页面的代码,然后解析对应的元素,拿到属性或者文本。
# titles
title_elems = driver.find_elements(by=By.CLASS_NAME, value="item-title")
titles = [title_elem.text for title_elem in title_elems]
是不是很神奇,看到了By.CLASS_NAME,是不是一下子联想到了CSS了。是的,你的预感足够的正确。如果以上的内容带给你足够的震撼和惊奇,请继续往下看,
# 所有的更新时间
related_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-related > span.time")
relateds = [related_elem.text for related_elem in related_elems]
# 所有的描述信息
desc_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-desc > span")
# 需要去除新闻摘要结尾的()内容
descs = [desc_item.text[:desc_item.text.rfind('(')] for desc_item in desc_elems]
没错,"div.item-related > span.time"这个是什么选择起来着?后代选择器。nice,CSS的选择器它都支持。
来个小插曲:你知道的CSS选择器有哪些?
- 元素选择器
p div- 类选择器
.highlight- ID选择器
#id- 属性选择器
[type='text']- 后代选择器
ul li- 子元素选择器
ul > li- 相邻兄弟选择器
h2+p- 通用选择器
*
不要觉得我是多余的了,其实这些选择器会了,基本上在页面的爬取上就是无敌了。另外,selenium还有这几种选择器:
class By:"""Set of supported locator strategies."""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"
常用的还是XPATH TAD_NAME CLASS_NAME CSS_SELECTOR 大家感兴趣的话可以自行的研究。
最后插一句话哈,作为后端的开发人员,我很希望我的接口、网站是可以正常访问的,给用户提供稳定的服务。但是,爬虫的话,对网站的危害很大的,特别是计算机的运行速度要比人快很多倍,相当于一下子加重了服务器的负担,类似于
DOS攻击了。一旦爬虫劫持了流量,其它的用户就不能正常的访问了。所以,在后端的接口设计上一般采取的是
限流,但是也会降低用户的使用体验。所以,适当的学习学习就可以啦。也得守住法律的底线,话说:“python是包四餐的学科”。
相关文章:
python优雅地爬虫
申明:仅用作学习用途,不提供任何的商业价值。 背景 我需要获得新闻,然后tts,在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路:获得html内容-> python的工具库解析࿰…...
mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log
0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…...
vscode关闭绑定元素“xxx”隐式具有“any”类型这类错误
在ts的项目里面,真的经常看到any类型的报错,真的很烦的 所以为了眼不见心不乱,我决定消除这个错误提示 在tsconfig.json里面配置 "noImplicitAny": false 就可以了 {"compilerOptions": {"target": "E…...
View绘制流程-Window创建
前言: View绘制流程中,主要流程是这样的: 1.用户进入页面,首先创建和绑定Window; 2.首次创建以及后续vsync信号来临时,会请求执行刷新流程; 3.刷新流程完成后,会通知SurfaceFlin…...
Jenkins build包时虽然单元测试失败了,但是仍然可以成功build包(最终结束时build success)
1.尝试方案1: 尽管单元测试失败,Jenkins Maven仍然可以获得成功-Java 学习之路 将 -Dmaven.test.failure.ignorefalse 添加到 MAVEN_OPTS artifactoryMaven {goals "-U clean install -Dmaven.test.skipfalse -DallowSnapshotstrue -Dmaven.te…...
【vue3】基础知识点-setup语法糖
学习vue3,都会从基础知识点学起。了解setup函数,ref,recative,watch、comptued、pinia等如何使用 今天说vue3组合式api,setup函数 在学习过程中一开始接触到的是这样的,定义数据且都要通过return返回 <…...
idol!! 2023牛客暑期多校训练营6 C
登录—专业IT笔试面试备考平台_牛客网 题目大意:定义n!!等于与n的奇偶性相同的所有小于等于n的数的阶乘之和,问n!!的末尾有多少0 1<n<1e18 思路:因为末尾0的来源是2*5,而2的个数明显比5的个数多得多,所以末尾…...
深入理解Jdk5引入的Java泛型:类型安全与灵活性并存
深入理解Jdk5引入的Java泛型:类型安全与灵活性并存 在Java的中,有一个强大的工具,它可以让你在编写代码时既保持类型安全,又享受灵活性。**这个工具就是——泛型(Generics)。**本文将引导你深入了解Java…...
idea在控制台中输出文字显示乱码
VM options中加入下面这行 -Dfile.encodingutf-8...
hacksudo3 通关详解
环境配置 一开始桥接错网卡了 搞了半天 改回来就行了 信息收集 漏洞发现 扫个目录 大概看了一眼没什么有用的信息 然后对着login.php跑了一下弱口令 sqlmap 都没跑出来 那么利用点应该不在这 考虑到之前有过dirsearch字典太小扫不到东西的经历 换个gobuster扫一下 先看看g…...
CentOS 虚拟机磁盘扩容(非常实用)
新手村的选手在刚开始安装使用 CentOS 虚拟机时,很多选项都会按照推荐操作来,比如:磁盘推荐大小为 20 GB;但随着后面的使用,总会因为“磁盘根目录不足”原因,而导致软件无法安装、虚拟机无法正常运行等&…...
docker案例复现
$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试,需要我们有一定的环境,也就是需要大家去安装docker 更新系统软件包: sudo yum update 安装 Docker 的依赖软件包: sudo yum …...
淘宝资源采集(从零开始学习淘宝数据爬取)
1. 为什么要进行淘宝数据爬取? 淘宝数据爬取是指通过自动化程序从淘宝网站上获取数据的过程。这些数据可以包括商品信息、销售数据、评论等等。淘宝数据爬取可以帮助您了解市场趋势、优化您的产品选择以及提高销售额。 淘宝作为全球的电商平台,每天都有…...
【C语言】预处理详解
本文目录 1 预定义符号 2 #define 2.1 #define 定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 2.7 命名约定 3 #undef 4 命令行定义 5 条件编译 6 文件包含 6.1 头文件被包含的方式 6.2 嵌套文件包含 1 预定义符号 __…...
2023中国(合肥)场景创新峰会成功举办,全息网御被纳入《合肥市第二批场景能力清单》
场景作为重要的城市资源,在驱动科技创新、产业发展、城市治理方面发挥着重要作用。近年来,为促进数字技术与实体经济深度融合,加速前沿科技转化落地、吸引全球创新资源集聚,合肥市聚焦“双找”:为产品找场景࿰…...
QT QLCDNumber 使用详解
本文详细的介绍了QLCDNumber控件的各种操作,例如:新建界面、源文件、设置显示位数、设置进制、设置外观、设置小数点、设置溢出、显示事件、其它文章等等操作。 实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时…...
明年,HarmonyOS不再兼容Android应用!
2023年华为开发者大会,不知道各位老铁们是否观看了,一个震撼的消息就是,首次公开了HarmonyOS NEXT的概念,简而言之就是,这是一款专为开发者打造的预览版操作系统,旨在提供"纯正鸿蒙操作系统"的体…...
华为OD机试 - 人气最高的店铺(Java JS Python)
题目描述 某购物城有m个商铺,现决定举办一场活动选出人气最高店铺。 活动共有n位市民参与,每位市民只能投一票,但1号店铺如果给该市民发放 q 元的购物补贴,该市民会改为投1号店铺。 请计算1号店铺需要最少发放多少元购物补贴才能成为人气最高店铺(即获得的票数要大于其…...
mysql sql 语句sum求和嵌套数学表达式
今天有个需求, 已减高度 高度 x 单双开(单开1 双开2) x 2,要直接写在sql语句中。 表字段 包含 高度 和 单双开字段 值是字符串 (双开 左单开 右单开) -- 已减高度 2 * 单双开 * 高度 sum( -- 求和 表达式 已减高度 2 * 单双开 * 高度 t_cloth.hegiht * 2 * (case WHEN l…...
Java课题笔记~ Servlet编程
1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术,部署在服务器端的Web容器里,获取客户端的访问请求,并根据请求生成响应信息返回给客户端。 创建Servlet的方式,有 如下图:一般创建Servlet都…...
杰理之播放暂停的杂音【篇】
a2dp PLC...
springboot基于深度学习的图书推荐系统_ry1n8702_c006
前言 随着互联网的普及和电子商务的发展,线上图书销售平台越来越多,用户在选择图书时面临海量数据的选择困难。传统的图书推荐方式,如书店的畅销书榜单、图书馆的分类推荐等,已经难以满足用户个性化、精准化的阅读需求。因此&…...
SwartNinjaPIR:嵌入式高可靠PIR运动检测驱动库
1. SwartNinjaPIR 库概述:面向嵌入式系统的高可靠性 PIR 运动检测驱动设计SwartNinjaPIR 是一个专为 Arduino 及兼容平台(如 STM32、ESP32 等基于 Arduino Core 的 MCU)设计的轻量级、生产就绪型被动红外(Passive Infrared, PIR&a…...
从一次RDP爆破到全网挖矿:复盘Windows Server 3389端口的安全加固与监控策略
Windows Server 3389端口安全防御体系:从RDP爆破到挖矿攻击的全链路防护 最近处理了一起典型的服务器入侵事件:攻击者通过RDP暴力破解获取管理员权限后,在服务器上部署了挖矿程序。这种攻击模式看似简单,却暴露出许多企业在Windo…...
新手福音:通过快马生成图文并茂的ccswitch安装教程代码,轻松上手
最近在折腾一个叫ccswitch的工具,作为刚入门的新手,真的被各种环境配置搞得头大。好在发现了InsCode(快马)平台,它能直接生成带详细注释的安装教程代码,简直是救命稻草!今天就把这个图文并茂的教程项目分享给大家。 c…...
C++ 模板元编程在性能优化中的作用
C 模板元编程在性能优化中的作用 在现代C开发中,性能优化始终是开发者关注的核心问题之一。而模板元编程(Template Metaprogramming, TMP)作为一种编译期计算技术,能够在程序运行前完成复杂的逻辑处理,从而显著提升运…...
功率半导体技术:GaN与SiC的性能对比与应用指南
1. 功率半导体技术演进背景在电力电子领域,功率半导体器件的发展经历了从硅(Si)到第三代半导体材料的重大跨越。作为工程师,我们正站在技术革新的关键节点:氮化镓(GaN)和碳化硅(SiC)这两种宽禁带半导体材料正在重塑功率转换的格局。传统硅基功…...
SEO_网站SEO排名下降的五大原因及应对技巧
SEO:网站SEO排名下降的五大原因及应对技巧 在数字营销的世界里,网站的SEO排名对于吸引流量和提升业务是至关重要的。随着搜索引擎算法的不断更新,很多网站会经历SEO排名下降的困境。本文将详细探讨网站SEO排名下降的五大原因,并提供相应的应…...
AD7193高精度ADC驱动设计与嵌入式集成实践
1. PRDC_AD7193 库概述:面向高精度测量的 AD7193 嵌入式驱动设计与工程实践AD7193 是 Analog Devices(ADI)推出的一款专为高精度、低噪声测量场景优化的 Σ-Δ 型 24 位模数转换器(ADC)。其核心特性包括:集…...
阿里通义实验室FunAudioLLM实战:如何用SenseVoice快速搭建多语言语音识别系统(附代码)
基于SenseVoice构建多语言语音识别系统的工程实践指南 语音识别技术正在重塑人机交互的边界,而阿里通义实验室开源的FunAudioLLM项目中的SenseVoice模型,为开发者提供了一把打开多语言语音世界的钥匙。不同于传统ASR系统需要针对不同语言单独训练模型的繁…...
