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

2022-10-16 22:16:39 +08:00
 wyzh97

尝试使用 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()


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

2368 次点击
所在节点    Python
13 条回复
raycool
2022-10-16 22:19:09 +08:00
协程没有运行
wyzh97
2022-10-16 22:24:40 +08:00
@raycool 我看到别人的代码就是这样的啊, 怎么解决呢?
tuiL2
2022-10-16 22:28:15 +08:00
asyncio.run(main())
wyzh97
2022-10-16 22:39:09 +08:00
@tuiL2 最后面直接添加: `asyncio.run(main())`, 提示出错啊 `RuntimeError: Event loop is closed`,
shinonome
2022-10-16 23:17:40 +08:00
为啥不同步运行- -
q409195961
2022-10-16 23:21:28 +08:00
asyncio.get_event_loop().run_until_complete(main())
zeusho871
2022-10-17 08:15:27 +08:00
这年头用什么 pyppeteer 兄弟,试试 playwright ?
ghh617415200
2022-10-17 09:42:05 +08:00
@wyzh97
@tuiL2 他的意思是让你把 asyncio.ensure_future(main()) 换成 asyncio.run(main())
ghh617415200
2022-10-17 09:42:57 +08:00
pyppeteer 使用 pip 安装后还需要一步:pyppeteer-install 你这一步执行过嘛?刚刚试了一下,代码确实是没有问题的
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
2022-10-17 12:06:07 +08:00
launch (options={'args':['--no-sandbox']})
wyzh97
2022-10-18 20:48:19 +08:00
@zhejiangblue 谢谢大哥前辈的悉心指导, 关于异步 /协程这块一直不太熟悉, 请教下在哪里详细的学习这个呢? (B 站很多都是入门的不怎么系统的教程), 谢谢了
zhejiangblue
2022-12-30 10:56:18 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/887376

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX