Pyppeteer是Puppeteer的非官方Python支持,Puppeteer是一个无头JavaScript的基于Chrome/Chromium浏览器自动化库,可以用于对渲染网页的抓取。
pip install pyppeteer
browser = await launch(headless=False)
headless默认为True,即无界面启动。
page = await browser.newPage()
page.setViewport({'width': 1200, 'height': 800})
page.goto(url)
browser.pages()
page.content()
page.type(selector, text)
selector用于确认节点位置。
- Type selector
- 语法:
eltname
- 例子: input对应
- Class selector
- 语法:
.classname
- 例子:
.index
对应class=index
- ID selector
- 语法:
#idname
- 例子:
#index
对应id=index
- Universal selector
选择所有元素,或者可以限制到特定的名称空间或所有名称空间。
- 语法:
*
ns|*
*|*
- 例子:
*
会匹配到所有元素- Attribute selector
- 语法:
[attr]
[attr=value]
[attr~=value]
[attr|=value]
[attr^=value]
[attr$=value]
[attr*=value]
- 例子:
[autoplay]
将匹配所有设置了autoplay attr对象的元素(任何值)。
page.click(selector)
page.screenshot({'path': 'example.png'})
具体用法可参考Puppeteer中文教程。
Pyppeteer 是基于 Python 的新特性 async 实现,里面进行了异步操作,所以需要配合 async/await 关键词来实现。
Pyppeteer访问页面后,使用page.content()
获取源代码,用 pyquery 解析获得JavaScript 渲染的结果。
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq
async def main():
browser = await launch(headless=False)
page = await browser.newPage()
await page.setViewport({'width': 1200, 'height': 800})
await page.goto('https://www.toutiao.com')
await asyncio.sleep(5)
# 在搜索框中输入python
await page.type('input.tt-input__inner', 'python')
# 点击搜索按钮
await page.click('button.tt-button')
await asyncio.sleep(5)
# print(page.url)
# 今日头条点击后新开一个页面, 通过打印url可以看出page还停留在原页面
# 以下用于切换至新页面
pages = await browser.pages()
page = pages[-1]
# print(page.url)
page_source = await page.content()
text = pq(page_source)
await page.goto(url="https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=60&format=json&keyword=python&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis×tamp=1555589585193")
for i in range(1, 10):
print(text("#J_section_{} > div > div > div.normal.rbox > div > div.title-box > a > span".format(i)).text())
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!
使用Pyppeteer抓取渲染网页