【爬虫】7.2. JavaScript动态渲染界面爬取-Selenium实战
JavaScript动态渲染界面爬取-Selenium实战
爬取的网页为:https://spa2.scrape.center,里面的内容都是通过Ajax渲染出来的,在分析xhr时候发现url里面有token参数,所有我们使用selenium自动化工具来爬取JavaScript渲染的界面。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
import logging
from selenium.webdriver.support import expected_conditions
import re
import json
from os import makedirs
from os.path import exists# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
# 基本url
url = "https://spa2.scrape.center/page/{page}"
# selenium初始化
browser = webdriver.Chrome()
# 显式等待初始化
wait = WebDriverWait(browser, 10)
book_url = list()# 目录设置
RESULTS_DIR = 'results'
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
# 任意异常
class ScraperError(Exception):pass# 获取书本URL
def PageDetail(URL):browser.get(URL)try:all_element = wait.until(expected_conditions.presence_of_all_elements_located((By.CSS_SELECTOR, ".el-card .name")))return all_elementexcept TimeoutException:logging.info("Time error happen in %s while finding the href", URL)# 获取书本信息
def GetDetail(book_list):try:for book in book_list:browser.get(book)URL = browser.current_urlbook_name = wait.until(expected_conditions.presence_of_element_located((By.CLASS_NAME, "m-b-sm"))).textcategories = [elements.text for elements in wait.until(expected_conditions.presence_of_all_elements_located((By.CSS_SELECTOR, ".categories button span")))]content = wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, ".item .drama p[data-v-f7128f80]"))).textdetail = {"URL": URL,"book_name": book_name,"categories": categories,"content": content}SaveDetail(detail)except TimeoutException:logging.info("Time error happen in %s while finding the book detail", browser.current_url)# JSON文件保存
def SaveDetail(detail):cleaned_name = re.sub(r'[\/:*?"<>|]', '_', detail.get("book_name"))detail["book_name"] = cleaned_namedata_path = f'{RESULTS_DIR}/{cleaned_name}.json'logging.info("Saving Book %s...", cleaned_name)try:json.dump(detail, open(data_path, 'w', encoding='utf-8'),ensure_ascii=False, indent=2)logging.info("Saving Book %s over", cleaned_name)except ScraperError as e:logging.info("Some error happen in %s while saving the book detail", cleaned_name)# 主函数
def main():try:for page in range(1, 11):for each_page in PageDetail(url.format(page= page)):book_url.append(each_page.get_attribute("href"))GetDetail(book_url)except ScraperError as e:logging.info("An abnormal position has occurred")finally:browser.close()if __name__ == "__main__":main()相关文章:
【爬虫】7.2. JavaScript动态渲染界面爬取-Selenium实战
JavaScript动态渲染界面爬取-Selenium实战 爬取的网页为:https://spa2.scrape.center,里面的内容都是通过Ajax渲染出来的,在分析xhr时候发现url里面有token参数,所有我们使用selenium自动化工具来爬取JavaScript渲染的界面。 fr…...
c语言实训心得3篇集合
c语言实训心得体会一: 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里…...
2023高教社杯数学建模B题思路代码 - 多波束测线问题
# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播, 在不同界面上产生反射, 利用这一原理,从测量船换能器垂直向海底发射声波信 号,并记录从声波发射到…...
MySql 变量
1.系统变量 1.1 系统变量分类 变量由系统定义,不是用户定义,属于 服务器 层面。系统变量分为全局系统变量(需要添加 global 关键字)以及会话系统变量(需要添加 session 关键字),有时也把全局系…...
2023-简单点-make和build都是什么东西?
make make命令根据makefile.txt中的命令进行批量处理。 编译时自动检查文件是否更新,如果文件已经更改,make会对他重新编译,否则跳过。 编译选定的目标,但是Make只编译上次编译变化过的文件,减少重复劳动࿰…...
Nginx 学习(八)Nginx实现用IP测试灰度发布
1.1 问题 配置Nginx使其可以将动态访问转交给uWSGI: 1.2 方案 安装Python工具及依赖 安装uWSGI并编写配置文件 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一: 1)安装python依赖软件[rootproxy python]# yum -y install gcc make pytho…...
QT 自定义信号
自定义信号,需要 1.在singnals:区域下写信号函数,以及函数对应的参数 2. 需要emit关键字进行发射信号 3. 在需要处理该信号的其他类中,建立信号和其信号槽函数connect() 4. 在其他类中创建信号处理槽函数 #include "mythread.h"my…...
注解方式配置SpringMVC
注解配置SpringMVC 1. 初始化类,代替web.xml2. 创建SpringConfig配置类,代替spring的配置文件3. 创建SpringMVCConfig配置类,代替SpringMVC.xml配置文件4. 项目结构 1. 初始化类,代替web.xml Spring3.2引入了一个便利的WebApplic…...
2023年限售股解禁研究报告
第一章 概述 解禁是指限售流通股过了限售承诺期,可以在二级市场自由买卖的过程。根据流通性质,可将上市公司股份分为有限售条件的流通股(“限售流通股”)及无限售条件的流通股(“流通股”)。 限售流通股指…...
『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
08 Qt Designer中容器布局和绝对布局的使用 1 容器布局1.1 设计容器布局1.2 保存文件并执行2 绝对布局2.1 设计绝对布局2.2 保存文件并执行1 容器布局 1.1 设计容器布局 先拖入一个容器Frame容器,然后拖入几个控件: 把拖入的控件拖入容器中: 选中容器,右键-布局-栅格布局:…...
Android 下第一个fragment app 先Java 后Kotlin
看着视频学习的,Fragment:3.Fragment使用方法_哔哩哔哩_bilibili 程序的运行效果是,手机页面有2个fragment,每个fragment 有一个text view,一个按钮,按一下显示,fine,and you?,各自…...
行业追踪,2023-09-04
自动复盘 2023-09-04 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
Android MQTT:实现设备信息上报与远程控制
Android MQTT:实现设备信息上报与远程控制 1. 介绍 1.1 MQTT是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,最初由IBM开发,用于连接远程设备与服务器之间的通信。它在物…...
Python爬虫——新手使用代理ip详细教程
Python代理IP爬虫是一种可以让爬虫拥有更多网络访问权限的技术。代理IP的作用是可以为爬虫提供多个IP地址,从而加快其爬取数据的速度,同时也可以避免因为访问频率过高而被网站封禁的问题。本文将介绍如何使用Python实现代理IP的爬取和使用。 一、代理IP的…...
idea VCS配置多个远程仓库
Idea VCS配置多个远程仓库 首先要有连个远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔: 应用开源架构进行项目开发,特别是那…...
LKPNR: LLM and KG for Personalized News Recommendation Framework
本文是LLM系列文章,针对《LKPNR: LLM and KG for Personalized News Recommendation Framework》的翻译。 LKPNR:LLM和KG的个性化新闻推荐框架 摘要1 引言2 相关工作3 问题定义4 框架5 实验6 案例7 结论 摘要 准确地向用户推荐候选新闻文章是个性化新闻推荐系统面…...
Xshell只能打开一个会话、左边栏消失不见、高级设置在哪儿、快捷键设置解决
Xshell只能打开一个会话、左边会话栏消失不见、高级设置在哪儿解决 1.问题: xshell会话(窗口)上方切换栏不见了的处理办法 解决方法:ctrl shift t 2.问题: 左边会话管理器不见了 解决方法: 3.问题…...
Android Retrofit 高级使用与原理
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
Unity3D开发流程及注意事项
使用Unity3D开发游戏需要遵循一定的流程和注意事项,以确保项目的顺利进行并获得良好的结果。以下是一般的游戏开发流程以及一些注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 游…...
表单引擎的自定义控件的概念与设计
基本概念 概述 控件的定义:用于展示或者采集数据的表单元素,称为控件,比如:文本框、下拉框、单选按钮、从表等.自定义控件:表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义,比如&#…...
ai辅助开发新体验:在快马平台用对话创建智能天气应用
最近在做一个天气应用的小项目时,遇到了一个很实际的问题:GitHub经常打不开,导致想参考的开源代码库无法访问。这时候,我发现InsCode(快马)平台的AI辅助开发功能简直是个救星,完全改变了我的开发方式。 需求分析阶段 以…...
FanControl终极指南:如何免费掌控电脑风扇,告别噪音困扰
FanControl终极指南:如何免费掌控电脑风扇,告别噪音困扰 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHu…...
Proteus仿真跑通了,实物电路为啥不亮?C51单片机驱动LED的5个硬件避坑指南
Proteus仿真成功但实物电路不亮?C51单片机驱动LED的5个硬件避坑指南 当你第一次在Proteus中看到LED按照预期闪烁时,那种成就感难以言表。然而,这种喜悦往往在转向实物搭建时戛然而止——电路板上的LED要么纹丝不动,要么常亮不灭&a…...
【计算机组成原理】——磁盘性能三要素:容量、寻址与传输的实战解析
1. 磁盘性能三要素:从理论到实战 刚接触计算机组成原理时,我对磁盘性能的理解仅限于"越大越好"。直到有次帮朋友选配NAS存储,面对商家宣传的"7200转高速盘"、"128MB缓存"等参数时,才发现自己完全不…...
从理论到实践:LCL逆变器谐振抑制的两种方法对比(有源阻尼vs输出电流反馈)
从理论到实践:LCL逆变器谐振抑制的两种方法对比(有源阻尼vs输出电流反馈) 在新能源发电和电力电子系统中,LCL滤波器因其出色的高频谐波衰减能力而备受青睐。然而,这种滤波器结构固有的谐振特性却像一把双刃剑——在提升…...
Joy-Con Toolkit开源工具:Switch手柄深度定制与性能优化方案
Joy-Con Toolkit开源工具:Switch手柄深度定制与性能优化方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款面向任天堂Switch玩家的开源手柄管理工具,提供专业级传…...
实战指南:用LLNet深度学习模型提升夜间监控画质(附Python代码)
实战指南:用LLNet深度学习模型提升夜间监控画质(附Python代码) 夜间监控画质提升一直是安防和无人机航拍领域的核心挑战。当光线不足时,传统ISP(图像信号处理器)往往难以平衡亮度增强与噪声抑制,…...
开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南
开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项…...
PostGIS中ST_Area计算面积时单位转换的实用技巧
1. 为什么ST_Area在WGS84坐标系下计算结果不对劲? 第一次用PostGIS的ST_Area函数计算地理围栏面积时,我盯着屏幕上那个小得离谱的数字愣了半天——0.000002?这还没我家卫生间大!后来才发现,原来90%的新手都会在这个坑里…...
用PLECS和C代码手把手教你实现数字滤波(附完整工程文件)
用PLECS和C代码实现数字滤波的工程实践指南 在电力电子和电机控制领域,数字滤波技术是实现信号处理的关键环节。无论是消除高频噪声还是提取特定频段的信号成分,一个设计良好的数字滤波器都能显著提升系统性能。本文将带您从理论到实践,通过P…...
