【Python】pyppeteer 简单使用2

复制代码
import sys
sys.path.append("/home/user/.local/lib/python3.9/site-packages")  #将包的路径添加到环境变量
import asyncio
from pyppeteer import launch
from pyppeteer.errors import TimeoutError
from pyppeteer_stealth import stealth #反检测模块,隐藏浏览器特征

width,height = 1366,768
async def main():
    brower = await launch({"executablePath":"/opt/browser360/browser360-cn"}, #指定已安装的浏览器,
                          headless = False,#无界面模式关闭,显示界面
                          args = ["--disable-infobars",f"--window-size={width},{height}"],#关闭提示”Chrome 正受到自动测试软件的控制”,设定界面大小
                          #devtools = True,#打开调试模式,如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False
                          )
    page = await brower.newPage() #打开一个新的标签页
    await stealth(page)  #反检测模块,隐藏特征
    await page.setViewport({"width":width,"height":height}) #界面大小
    try:
        await page.goto("https://spa6.scrape.center/")
        await page.evaluate("""() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }""") #使用 JavaScript 将它设置为false,规避webdriver检测
        await page.waitForSelector(".item .name", options={'timeout': 20 * 1000}) #等待符合 .item .name 的节点加载出来,最长等待 20 秒
        await page.waitForSelector("h2", options={'timeout': 20 * 1000})  # 等待符合 h2 的节点加载出来,最长等待 20 秒
    except TimeoutError:
        print("TimeoutError")

    print(await page.querySelectorAllEval('.item .name', 'nodes => nodes.map(node => node.href)')) #链接href,class为name
    """调用了 querySelectorAllEval 方法,它接收两个参数,第一个参数是 selector ,代表要选择的节点对应的 CSS 选择器;第二个参数是 pageFunction ,
    代表的是要执行的 JavaScript 方法,这里需要传入的是一段 JavaScript 字符串,整个方法的作用是选择 selector 对应的节点,
    然后对这些节点通过 pageFunction 定义的逻辑抽取出对应的结果并返回。由于提取结果有多个,所以这里 JavaScript 对应的 pageFunction 输入参数就是 nodes ,
    输出结果是调用了 map 方法得到每个 node ,然后调用 node 的 href 属性即可。这样返回结果就是当前列表页的所有电影的详情页 URL 组成的列表了。"""
    print(await page.querySelectorEval('h2', 'node => node.innerText')) #单个节点,第一个节点的文本值
    print(await page.querySelectorAllEval('h2', 'nodes => nodes.map(node => node.innerText)')) #多个节点,文本值,名称 h2 节点
    print(await page.querySelectorAllEval('.cover', 'nodes => nodes.map(node => node.src)'))  # 多个节点,src,封面class为cover
    await brower.close()
asyncio.get_event_loop().run_until_complete(main())
复制代码

原界面;

原界面有很多条: 

输出:

 

 

posted @   山鬼谣`  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示