import json
import logging
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
import asyncio
from os import makedirs
from os.path import exists
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s")
INDEX_URL = "https://dynamic2.scrape.center/page/{page}"
TIMEOUT = 10
TOTAL_PAGE = 10
WINDOW_WIDTH, WINDOW_HEIGHT = 1366, 768
HEADLESS = False
RESULTS_DIR = "results"
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
browser, tab = None, None
# 初始化一个浏览器,新建一个选项卡,设置浏览器大小和当前选项卡页面的大小
async def init():
global browser, tab
browser = await launch(headless=HEADLESS,
args=['--disable-infobars', f'--window-size={WINDOW_WIDTH},{WINDOW_HEIGHT}'])
tab = await browser.newPage()
await tab.setViewport({"width": WINDOW_WIDTH, "height": WINDOW_HEIGHT})
async def scrape_page(url, selector):
"""
通用爬取的方法
:param url: 需要爬取的链接
:param selector: 等待渲染出的节点对应的css选择器
:return: 只是打开当前链接的页面进行加载,没有解析行为
"""
logging.info("scraping %s" % url)
try:
# 运行时页面会先访问这个url,等待节点家族,最多等待10秒,如果加载出来接着往下执行,否则抛出异常,输出到日志
await tab.goto(url)
await tab.waitForSelector(selector, options={
"timeout": TIMEOUT * 1000
})
except TimeoutError:
logging.error("error occurred while scraping %s" % url, exc_info=True)
async def scrape_index(page):
"""
爬取列表页
:param page: 当前的页码
:return:
"""
url = INDEX_URL.format(page=page)
await scrape_page(url, ".item .name")
async def parse_index():
"""
解析列表页,提取详情页的url
querySelectorAll返回节点列表
querySelectorAllEval(selector,pageFunction) # 参数1:css选择器 参数2:要执行的js代码
这里 JavaScript 对应的 pageFunction 输入参数就是 nodes,输出结果是调用了 map 方法得到每个 node,
然后调用 node 的 href 属性即可。这样返回结果就是当前列表页的所有电影的详情页 URL 组成的列表了
:return:返回详情页url组成的列表
"""
return await tab.querySelectorAllEval(".item .name", "nodes => nodes.map(node => node.href)")
async def scrape_detail(url):
"""
详情页爬取
:param url: 当前详情页的URL
:return:
"""
await scrape_page(url, "h2")
async def parse_detail():
"""
解析详情页面
:return: 返回当前页面的字典数据
"""
url = tab.url # 获取当前选项卡的url
name = await tab.querySelectorEval("h2", "node => node.innerText")
categories = await tab.querySelectorAllEval(".categories button span", "nodes => nodes.map(node => node.innerText)")
cover = await tab.querySelectorEval(".cover", "node => node.src")
score = await tab.querySelectorEval(".score", "node => node.innerText")
drama = await tab.querySelectorEval(".drama p", "node => node.innerText")
return {
"url": url,
"name": name,
"categories": categories,
"cover": cover,
"score": score,
"drama": drama,
}
async def save_data(data):
name = data.get("name")
data_path = f"{RESULTS_DIR}/{name}.json"
json.dump(data, open(data_path, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
async def main():
await init() # 浏览器初始化
try:
for page in range(1, TOTAL_PAGE + 1):
await scrape_index(page) # 加载当前页面
detail_urls = await parse_index() # 解析当前页面
for detail_url in detail_urls:
await scrape_detail(detail_url)
detail_data = await parse_detail()
await save_data(detail_data)
logging.info("data %s" % detail_data)
finally:
await browser.close()
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
# 第一步:初始化一个浏览器的方法
# 第二步:创建一个通用爬取页面的方法
# 第三步:创建一个爬取列表页的方法,调用第二步
# 第四步:创建一个单独获取列表页中详情页url的解析方法
# 第五步:创建一个爬取详情页的方法,调用第二步
# 第六步:创建一个解析详情页数据的方法
# 第七步:创建一个保存json数据的方法
# 第八步:整合所有方法
# 对比aiohttp:因为pyppeteer是依托于浏览器加载ajax的,所以无法在tasks列表中直接请求api
# 所以即使使用了asyncio,也是逐个请求返回数据的
# 如果是aiohttp直接请求api,可以用下面的方法,创建tasks任务列表,使用gather启动任务
# session = aiohttp.ClientSession()
# scrape_index_tasks = [asyncio.ensure_future(scrape_index(page=page)) for page in range(1, PAGE_NUMBER + 1)]
# results = await asyncio.gather(*scrape_index_tasks) # 列表页返回json数据
相关推荐
wincc 服务器授权型号,WinCC V7.5 SP1软件安装及授权方法
上篇教程给大家介绍了TIA Portal V16 安装方法,今天分享一下WinCC V7.5 SP1。目前V7.5 SP1是WinCC最新的版本,发布时间2019年11月13日。先放一个官网对WinCC V7.5 的介绍视频,感兴趣的可以先看一下。1、软件下载官网下载链接:https://support.industry.siemens.com/cs/document/109772879五个文件下...
python 自动化学习(四) pyppeteer 浏览器操作自动化
1、selenium //跨浏览器,官方维护的比较好,资料也多,各个版本比较稳定,源码读起来舒服//缺点是配置时需要留心程序语言的版本和驱动版本以及浏览器版本,还有就是本身不支持步//需要重写源码或者利用grid分布式来实现异步2、pyppeteer //是基于chrome官方为chromium定制的自动化测试框架puppeteer而//实现的一个python包装的非官方版本框架,最后一次更新是在2018年//优点就是速度比selenium快,支持异步,常被拿来做爬虫,
MATLAB新手必看:5分钟搞定直流无刷电机Simulink仿真(附完整模型下载)
本文为MATLAB新手提供直流无刷电机Simulink仿真的快速入门指南,涵盖从环境配置到速度控制闭环实现的完整流程。通过详细的模块选择和参数设置说明,帮助读者5分钟内搭建基础仿真模型,并附赠完整模型下载,助力快速掌握电机控制仿真技术。
第19讲:Pyppeteer 爬取实战
在上一课时我们了解了 Pyppeteer 的基本用法,确实我们可以发现其相比 Selenium 有很多方便之处。 本课时我们就来使用 Pyppeteer 针对之前的 Selenium 案例做一次改写,来体会一下二者的不同之处,同时也加强一下对 Pyppeteer 的理解和掌握情况。 1.爬取目标 本课时我们要爬取的目标和之前是一样的,还是 Selenium 的那个案例,地址为:https://dynamic2.scrape.cuiqingcai.com/,如下图所示。 这个网站的每个详情页的 URL 都是
UE5新手必看:3种UI定位方法实战(含蓝图配置截图)
本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。
微信支付开发之平台给用户转账到零钱的功能
请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。
pyppeteer实战
import logging import asyncio from pyppeteer import launch from pyppeteer.errors import TimeoutError from motor.motor_asyncio import AsyncIOMotorClient #数据库操作 motor_connect_string = 'mongodb://localhost:27017' momgodb_name = 'movie' mongo_collection_name.
S32K3 eMIOS使用介绍(PWM输出与输入捕获)——基于MCAL
本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm的输出及输入捕获。
2021-09-23-CR-014 Python爬虫,pyppetter的基本操作
pyppetter的基本操作 准备阶段 先安装 pyppeteer库 导入的名称同库名 查看浏览器版本 pyppeteer.__chromium_revision__ 查看浏览器存储路径 pyppeteer.executablePath() 简单示例 from pyppeteer import launch import asyncio async def main(): browser =await launch(headless=False, args=['--disable-info
基于FPGA的ov5640摄像头简易图像采集装置详解
本文介绍一种基于FPGA的,通过流模式DDR实现OV5640摄像头数据采集并显示的方法。
《YOLO26/YOLO11/YOLOv8改进与系统实战》,改进与系统实战专栏目录和介绍
YOLOv8 是目前比较火和比较成熟的深度学习框架,是2023年1月发布的,由 Ultralytics 团队开发。Ultralytics自YOLOv5 开始一直积极维护和更新 YOLO 框架,因此 YOLOv8 也享有持续的维护与升级支持。因此我写下《手把手教你YOLOv8实战》专栏,专门为那些对计算机视觉、深度学习、以及目标检测技术感兴趣的读者设计。通过本专栏,你将深入理解 YOLOv8 的核心原理与实际应用,从0 开始学习并掌握如何使用 YOLOv8 完成各类目标检测任务,帮助你快速上手并掌握 YOLO
Pyppeteer使用笔记
部分内容来自 https://mp.weixin.qq.com/s/Iz-DY1UrSfVFRFh5CyHl3Q https://www.cnblogs.com/zhang-zi-yi/p/10820813.html Pyppeteer介绍 如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工具,现在已经被广泛用于网络爬虫中来应对 ...
Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】
;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。
python爬虫模拟浏览器_python爬虫利器 pyppeteer(模拟浏览器) 实战
现在有新方法可以搞定这个模拟登陆了,不会被检测出来,可以完美的绕过对window.navigator.webdriver的检测,pyppeteer是个好东西!需要用到的python包:asyncio、pyppeteer友情提醒一下,第一次运行pyppeteer的会下载chromium,速度很慢慢慢慢,还有可能失败。务必耐心等待!!!然后,这个pyppeteer对网速和电脑运行速度还有一定的要求下载...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
python爬虫利器 pyppeteer(模拟浏览器) 实战
现在有新方法可以搞定这个模拟登陆了,不会被检测出来,可以完美的绕过对window.navigator.webdriver的检测,pyppeteer是个好东西! 需要用到的python包:asyncio、pyppeteer 友情提醒一下,第一次运行pyppeteer的会下载chromium,速度很慢慢慢慢,还有可能失败。务必耐心等待!!!然后,这个pyppeteer对网速和电脑运行速度还有一定的要求...
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
2-6.自动化采集
实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID,id),二者得到的结果完全一致。注意,在这个方法的名称中,element多了一个s,注意区分。在Selenium中,get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源代码中也不一定能成功获取到。...............
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
Puppeteer 使用教程-基础篇(超详细、超全面)
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。本文涉及了Puppeteer常见常用的API样例,包括爬取图片、视频、cookies设置,字符输入等多方面知识,很全面哦。
Pyppeteer库之四:Pyppeteer的页面操作(下)
执行自定义的 JS 脚本 Pyppeteer Page 对象提供了一系列 evaluate 方法,你可以通过他们来执行一些自定义的 JS 代码,主要提供了下面三个 API: (1) page.evaluate ( pageFunction [, …args] ) ,返回 pageFunction 执行的结果,pageFunction 表示要在页面执行的函数或表达式, args 表示传入给 page...
【Python pyppeteer爬虫实战】抓取纵横小说图书信息,并存储到MySQL数据库
写在前面 本篇博客只是为练习pyppeteer的用法,其中的实践案例用其他的更简单方法也可以实现。 最近也是看完了崔庆才爬虫52讲里面pyppeteer的部分,就想着实战演练一遍(主要是里面的案例无法使用,哭唧唧),找了一下经常爬取的网站,例如淘宝,知网什么的,但是这些网站都需要登录,难度偏大一点,就给否决掉了,最后选到了纵横小说排行榜这个网站,因为这个网站没有什么反爬,不需要登录而且比较符合初始页加详情页这样常用的抓取数据的方法。 网站分析 初始列表页的url 翻页观察 多翻几个页面之后,发现初始页面
Pyppeteer爬取实战
Python Pyppeteer 爬虫
【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具 Pyppeteer 的使用。
Python 爬虫——Pyppeteer
Pyppeteer相比于Selenium最大的优势是可以实现无头浏览器,它可以在不开启浏览器页面的情况下模拟浏览器进行请求的发送和接收,并且支持原生的Javascript,可以实现更多样化的页面操作。模拟用户的方式可以很好的解决直接请求的难题,一般来说获取到的页面数据都是完全渲染之后的结果,可以看到的数据都可以进行内容提取(若页面加载不完全,也可以使用某些方式使得页面完全加载)
pyppeteer:比 selenium 更高效的爬虫利器
API 接口文档:API Reference:https://miyakogi.github.io/pyppeteer/reference.html pyppeteergithub 地址:https://github.com/miyakogi/pyppeteer pyppeteer英文文档地址:https://miyakogi.github.i...
Python爬虫之pyppeteer的使用(爬虫、获取cookie、截屏插件、防爬绕过)
下载文本中的网页源码,由于需要向下拉动滚动条所以使用pyppeteer渲染网页,并执行js代码,可是发现开启无界面的时候似乎执行不了js代码,还有异步的时候好像也执行不了js代码 import asyncio from pyppeteer import launch import re, os,time async def create_page(): browser = await launch(headless=True, dumpio=True) return browser
Pyppeteer:如何在 Python 中使用 Puppeteer 和 Browserless?
什么是 Pyppeteer?我们如何将 Pyppeteer 集成到 Browserless 中?在本篇博文中,您可以找到充分利用 Pyppeteer 的详细步骤。
Pyppeteer 的使用
puppeteer 是基于Node.js 开发的一个工具, 有了它,我们可以利用 JavaScript 控制 Chrome 浏览器的一些操作。当然, puppeteer 也可以用于网络爬虫,其 API 及其完善,功能非常强大。Pyppeteer 其实是 puppeteer 的 python 实现, 但不是 google 开发的,是由以为来自日本的工程师根据 puppeteer 的一些功能开发出来的非官方版本。
1万+



被折叠的 条评论
为什么被折叠?



