一、PythonPuppeteer是什麼
PythonPuppeteer是一個基於Python語言和Google Chrome Headless的無界面瀏覽器的庫,可以用來實現Web自動化操作和爬蟲。它提供了對Chrome Headless的完整控制,使用它可以對頁面進行無人值守的操作,如點擊、填寫表單、截屏等,同時也可以模擬真實瀏覽器行為進行自動化爬蟲。
其底層是Google Chrome Headless,因此支持標準的Web技術和API,例如JavaScript,CSS Selectors等。另外,PythonPuppeteer使用async/await實現異步操作,使得程序更具可讀性和易於維護。
安裝PythonPuppeteer可以使用pip命令:
pip install pyppeteer
二、使用PythonPuppeteer實現Web自動化
實現Web自動化操作,需要使用PythonPuppeteer中的pyppeteer庫中的launch方法來創建一個Page對象,進而使用Page對象的方法進行操作。
1、實例化Page對象
創建Page對象有兩種方式,一種是從browser中新建一個Page對象,另一種是從已存在的Page對象中創建一個新的Page對象。這裡我們以從browser中新建一個Page對象為例。
// 引入庫
import asyncio
from pyppeteer import launch
async def main():
# 創建browser對象
browser = await launch()
# 創建Page對象
page = await browser.newPage()
# 使用Page對象的方法進行操作
await page.goto('https://www.example.com')
# 關閉browser
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
2、使用Page對象進行操作
在獲取到Page對象之後,我們可以使用Page對象的方法進行自動化操作。例如,我們可以使用goto方法訪問某個網址,使用waitForSelector方法等待某個節點加載完成。
async def main():
# 創建browser和Page對象,訪問網址
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.example.com')
# 等待#example節點加載完成
await page.waitForSelector('#example')
# 點擊#example節點
await page.click('#example')
# 填寫表單輸入框
await page.type('input[name="username"]', 'username')
# 提交表單
await page.click('#submit')
# 關閉browser
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
三、使用PythonPuppeteer實現Web爬蟲
除了可以自動化操作Web頁面外,PythonPuppeteer還可以作為一個Python爬蟲的工具,用於解析爬取到的頁面,獲取所需的數據。下面將會通過一個實例來說明如何使用PythonPuppeteer實現一個簡單的Web爬蟲。
1、實例背景
我們希望爬取Python官網(https://www.python.org/)上的新聞,獲取新聞的標題、發布時間和詳情頁鏈接。
2、實現步驟
STEP 1:解析新聞列表頁
首先,我們需要使用Page對象訪問Python官網的新聞列表頁:https://www.python.org/blogs/。然後,使用Page對象的方法獲取新聞列表的節點,對節點進行解析,獲取每篇新聞的標題、發布時間和詳情頁鏈接。
async def main():
# 創建browser和Page對象,訪問新聞列表頁
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.python.org/blogs/')
# 解析新聞列表
articles = await page.querySelectorAll('.blog-widget li')
news_list = []
for article in articles:
news = {}
# 獲取每篇新聞的標題、發布時間和詳情頁鏈接
news['title'] = await article.querySelectorEval('.listing-item__title a', 'node => node.innerText')
news['pub_date'] = await article.querySelectorEval('.listing-item__date', 'node => node.innerText')
news['url'] = await article.querySelectorEval('.listing-item__title a', 'node => node.href')
# 加入新聞列表
news_list.append(news)
# 關閉browser
await browser.close()
return news_list
news_list = asyncio.get_event_loop().run_until_complete(main())
STEP 2:解析新聞詳情頁
獲取到新聞列表之後,我們需要對每篇新聞的詳情頁進行爬取,並解析出新聞的內容。在Python官網上,每篇新聞的詳情頁URL的格式為https://www.python.org/blogs/YYYY/MM/DD/title/,其中YYYY表示年份、MM表示月份、DD表示日期、title表示新聞標題。因此,我們可以通過拼接URL的方式訪問每篇新聞的詳情頁。
async def get_article_info(url):
# 創建browser和Page對象,訪問新聞詳情頁
browser = await launch()
page = await browser.newPage()
await page.goto(url)
# 獲取文章標題和內容
title = await page.querySelectorEval('.document-title', 'node => node.innerText')
content_raw = await page.querySelectorEval('.document-content', 'node => node.innerHTML')
# 解析內容
content = html.unescape(content_raw)
# 關閉browser
await browser.close()
return {'title': title, 'content': content}
async def main():
# 解析新聞列表
news_list = await get_news_list()
# 對每篇新聞的詳情頁進行解析
for news in news_list:
article_info = await get_article_info(news['url'])
news['content'] = article_info['content']
return news_list
news_list = asyncio.get_event_loop().run_until_complete(main())
3、完整代碼
// 引入庫
import asyncio
import html
from pyppeteer import launch
async def get_news_list():
# 創建browser和Page對象,訪問新聞列表頁
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.python.org/blogs/')
# 解析新聞列表
articles = await page.querySelectorAll('.blog-widget li')
news_list = []
for article in articles:
news = {}
# 獲取每篇新聞的標題、發布時間和詳情頁鏈接
news['title'] = await article.querySelectorEval('.listing-item__title a', 'node => node.innerText')
news['pub_date'] = await article.querySelectorEval('.listing-item__date', 'node => node.innerText')
news['url'] = await article.querySelectorEval('.listing-item__title a', 'node => node.href')
# 加入新聞列表
news_list.append(news)
# 關閉browser
await browser.close()
return news_list
async def get_article_info(url):
# 創建browser和Page對象,訪問新聞詳情頁
browser = await launch()
page = await browser.newPage()
await page.goto(url)
# 獲取文章標題和內容
title = await page.querySelectorEval('.document-title', 'node => node.innerText')
content_raw = await page.querySelectorEval('.document-content', 'node => node.innerHTML')
# 解析內容
content = html.unescape(content_raw)
# 關閉browser
await browser.close()
return {'title': title, 'content': content}
async def main():
# 解析新聞列表
news_list = await get_news_list()
# 對每篇新聞的詳情頁進行解析
for news in news_list:
article_info = await get_article_info(news['url'])
news['content'] = article_info['content']
return news_list
news_list = asyncio.get_event_loop().run_until_complete(main())
四、總結
PythonPuppeteer是一個強大的Web自動化工具和爬蟲工具,可以使用它來實現無人值守的自動化操作和高效的Web爬取。本文通過實例詳細講解了使用PythonPuppeteer實現Web自動化操作和爬蟲的步驟和方法,希望能夠幫助大家更好地應用PythonPuppeteer來解決實際問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/239066.html