V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wyzh97
V2EX  ›  Python

初试 Pyppeteer 爬虫, 直接访问不了网页, Help me pls...

  •  
  •   wyzh97 · 2022-10-16 22:16:39 +08:00 · 2367 次点击
    这是一个创建于 798 天前的主题,其中的信息可能已经有所发展或是发生改变。

    尝试使用 Pyppeteer 的爬虫功能怎么样, 结果浏览器都没有打开,唉;

    源代码如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import time
    import asyncio
    from pyppeteer import launch
    
    
    async def main():
        browser = await launch(headless=False)
        page = await browser.newPage()
        await page.goto("https://www.dandanzan10.top/dianying/")  # https://www.python.org
        # await page.screenshot(path="yvain.png")  #
        time.sleep(3)
        await page.screenshot({"path": "yvain.png"})
        print(page.content())  # 无法打印内容
        await browser.close()
    
    print("Starting...")
    # asyncio.create_task(main())
    asyncio.ensure_future(main())
    print("Screenshots has been taken.")
    

    问题如下: 0. 没有报错...感觉什么都没有发生

    1. 使用了browser = await launch(headless=False)根本没有打开浏览器;

    2. 也没有截图page.screenshot;

    3. 也没有任何内容打印page.content()

    4. 使用 vscode/pycharm 运行的结果如上: 0-4 条;

    5. 使用 Jupyter 运行还报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0), 但是会有个 Chromium 打开了, 但是没有任何动作.

    6. 其他: create_task()函数会报错, 才使用ensure_future()


    谁能帮帮我, 找不到什么原因了, 爬虫的第一步访问网页都搞不定. 唉

    13 条回复    2022-12-30 10:56:18 +08:00
    raycool
        1
    raycool  
       2022-10-16 22:19:09 +08:00
    协程没有运行
    wyzh97
        2
    wyzh97  
    OP
       2022-10-16 22:24:40 +08:00
    @raycool 我看到别人的代码就是这样的啊, 怎么解决呢?
    tuiL2
        3
    tuiL2  
       2022-10-16 22:28:15 +08:00
    asyncio.run(main())
    wyzh97
        4
    wyzh97  
    OP
       2022-10-16 22:39:09 +08:00
    @tuiL2 最后面直接添加: `asyncio.run(main())`, 提示出错啊 `RuntimeError: Event loop is closed`,
    shinonome
        5
    shinonome  
       2022-10-16 23:17:40 +08:00
    为啥不同步运行- -
    q409195961
        6
    q409195961  
       2022-10-16 23:21:28 +08:00
    asyncio.get_event_loop().run_until_complete(main())
    zeusho871
        7
    zeusho871  
       2022-10-17 08:15:27 +08:00 via Android
    这年头用什么 pyppeteer 兄弟,试试 playwright ?
    ghh617415200
        8
    ghh617415200  
       2022-10-17 09:42:05 +08:00
    @wyzh97
    @tuiL2 他的意思是让你把 asyncio.ensure_future(main()) 换成 asyncio.run(main())
    ghh617415200
        9
    ghh617415200  
       2022-10-17 09:42:57 +08:00
    pyppeteer 使用 pip 安装后还需要一步:pyppeteer-install 你这一步执行过嘛?刚刚试了一下,代码确实是没有问题的
    zhejiangblue
        10
    zhejiangblue  
       2022-10-17 11:23:27 +08:00
    ```python
    async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto("https://www.dandanzan10.top/dianying/") # https://www.python.org
    # await page.screenshot(path="yvain.png") #
    await asyncio.sleep(3)
    await page.screenshot({"path": "yvain.png"})
    print(await page.content())
    await browser.close()


    if __name__ == '__main__':
    print("Starting...")
    # asyncio.create_task(main())
    # asyncio.ensure_future(main())

    asyncio.run(main())
    print("Screenshots has been taken.")
    ```

    问题解答:
    1. 没有打开浏览器:协程没有运行
    2. 同上
    3. 同上,外加 page.content() 是个协程对象,因此需要 await
    6. 使用 create_task 前 必须要有 event_loop ,这个函数作用是创建 Task 对象,并立即加入到事件循环的 loop 中,如果 loop 为 None ,就会报错; ensure_future 是将协程对象或可等待对象包装成一个 Future 对象,loop 为空不会报错

    另外,
    - 协程中一般不用 time.sleep ,它不支持协程自动切换
    masker
        11
    masker  
       2022-10-17 12:06:07 +08:00 via Android
    launch (options={'args':['--no-sandbox']})
    wyzh97
        12
    wyzh97  
    OP
       2022-10-18 20:48:19 +08:00
    @zhejiangblue 谢谢大哥前辈的悉心指导, 关于异步 /协程这块一直不太熟悉, 请教下在哪里详细的学习这个呢? (B 站很多都是入门的不怎么系统的教程), 谢谢了
    zhejiangblue
        13
    zhejiangblue  
       2022-12-30 10:56:18 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5139 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.