最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新一代爬蟲(chóng)利器Python?Playwright詳解

 更新時(shí)間:2021年12月20日 15:29:25   作者:小志Codings  
這篇文章主要為大家介紹了新一代爬蟲(chóng)利器Playwright,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

Playwright是Microsoft在2020年初開(kāi)源的新一代自動(dòng)化測(cè)試工具,它的功能類(lèi)似于Selenium、Pyppeteer等,都可以驅(qū)動(dòng)瀏覽器進(jìn)行各種自動(dòng)化操作。它的功能也非常強(qiáng)大,對(duì)市面上主流瀏覽器都提供了支持,API功能簡(jiǎn)潔又強(qiáng)大。雖然誕生的比較晚,但是發(fā)展得非?;馃?。

在Pyppeteer已經(jīng)不再維護(hù)的年代,擁有Playwright這個(gè)開(kāi)源工具是非常棒的選擇,文檔豐富,功能強(qiáng)大。

安裝方式

conda config --add channels conda-forge
conda config --add channels microsoft
conda install playwright
playwright install

上述命令的具體運(yùn)行過(guò)程是下載Playwright并將其打包為Chromium、Firefox和Webkit安裝瀏覽器二進(jìn)制文件。

特點(diǎn)

  • Playwright支持當(dāng)前所有主流瀏覽器,包括Chrome和Edge(基于Chromium)、Firefox、Safari(基于Webkit),提供完善的自動(dòng)化控制的API。
  • Playwright支持移動(dòng)端頁(yè)面的測(cè)試,使用設(shè)備模擬技術(shù)可以在移動(dòng)web瀏覽器中測(cè)試響應(yīng)式web應(yīng)用程序。
  • Playwright支持所有瀏覽器的Headless模式和非Headless模式的測(cè)試。
  • Playwright的安裝配置非常的簡(jiǎn)單,安裝過(guò)程中會(huì)自動(dòng)安裝對(duì)應(yīng)瀏覽器的驅(qū)動(dòng),不需要額外的配置WebDriver等。
  • Playwright提供了大量的與自動(dòng)化相關(guān)的API,當(dāng)頁(yè)面加載時(shí)會(huì)自動(dòng)等待對(duì)應(yīng)節(jié)點(diǎn)的加載,大大的簡(jiǎn)化了編寫(xiě)API的難度。

使用方式

在python腳本中導(dǎo)入Playwright,并啟動(dòng)3種瀏覽器(Chromium、Friefox和webkit)的其中一種。Playwright支持兩種編寫(xiě)模式,一種是Pyppeter一樣的異步模式,另一種是像Selenium一樣的同步模式,我們可以根據(jù)實(shí)際的需要選擇不同的模式。

下面我們先來(lái)看看一個(gè)基本 同步模式的例子:

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.new_page()
        page.goto("https://www.baidu.com")
        page.screenshot(path=f"screenshot-{browser_type.name}.png")
        print(page.title())
        browser.close()

首先在這里我們導(dǎo)入了sync_playwright方法,然后調(diào)用這個(gè)方法,該方法返回的是一個(gè)PlaywrightContextManager對(duì)象,可以將其理解為瀏覽器的上下文管理器,這里將其賦值給變量p。接著調(diào)用PlaywrightContextManager對(duì)象的chromium、firefox、webkit瀏覽器實(shí)例,接著使用for循環(huán)依次去執(zhí)行它們的launch方法,同時(shí)設(shè)置headless為False。

這里有一個(gè)注意點(diǎn):如果launch沒(méi)有設(shè)置為Flase,默認(rèn)是無(wú)頭模式啟動(dòng)瀏覽器,我們看不到任何的窗口。

launch方法返回的是一個(gè)瀏覽器(Browser)對(duì)象,我們將其復(fù)制為browser變量,然后調(diào)用new_page方法,相當(dāng)于是新建一個(gè)選顯卡,返回page對(duì)象并賦值給變量page,接下來(lái)就是調(diào)用page對(duì)象的一系列自動(dòng)化API進(jìn)行操作。當(dāng)頁(yè)面加載完畢之后生成截圖、控制臺(tái)輸出結(jié)果就退出,上面的代碼,調(diào)用了page對(duì)象的兩個(gè)方法:

1、screenshot:參數(shù)傳一個(gè)文件的名稱(chēng),這樣截圖就會(huì)自動(dòng)保存為該文件的名稱(chēng)。

2、title:返回頁(yè)面的標(biāo)題。

這時(shí)當(dāng)前目錄便會(huì)產(chǎn)生三個(gè)截圖文件,都是百度的首頁(yè),文件名中都帶有瀏覽器的名稱(chēng),如圖所示:

控制臺(tái)運(yùn)行結(jié)果:

百度一下,你就知道
百度一下,你就知道
百度一下,你就知道

除了上面所描述的同步模式之外,Playwright還支持異步模式,如果在項(xiàng)目中使用了asyncio,那么就應(yīng)該是考慮要采用異步模式,使用異步的API,寫(xiě)法如下:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        for browser_type in [p.chromium, p.firefox, p.webkit]:
            browser = await browser_type.launch()
            page = await browser.new_page()
            await page.goto("https://www.baidu.com")
            await page.screenshot(path=f"screenshot-{browser_type.name}.png")
            print(await page.title())
            await browser.close()
asyncio.run(main())

從上面的代碼可以看出,整個(gè)寫(xiě)法和同步模式是很相似的。

注意:

? 1、導(dǎo)入的是async_playwright方法

? 2、在寫(xiě)法上添加 async/await 關(guān)鍵字。

代碼生成

Playwright還有一個(gè)強(qiáng)大的功能,那就是可以錄制我們?cè)跒g覽器的操作,并將操作時(shí)的代碼自動(dòng)生成。這個(gè)功能可以通過(guò)Playwright命令調(diào)用codegen來(lái)實(shí)現(xiàn),我們先看看codegen命令都有什么參數(shù)。

playwright codegen --help

結(jié)果類(lèi)似如下:

Usage: npx playwright codegen [options] [url]

open page and generate code for user actions

Options:
-o, --output <file name> saves the generated script to a file
--target <language> language to generate, one of javascript, test, python, python-async, csharp (default:
"python")
-b, --browser <browserType> browser to use, one of cr, chromium, ff, firefox, wk, webkit (default: "chromium")
--channel <channel> Chromium distribution channel, "chrome", "chrome-beta", "msedge-dev", etc
--color-scheme <scheme> emulate preferred color scheme, "light" or "dark"
--device <deviceName> emulate device, for example "iPhone 11"
--geolocation <coordinates> specify geolocation coordinates, for example "37.819722,-122.478611"
--ignore-https-errors ignore https errors
--load-storage <filename> load context storage state from the file, previously saved with --save-storage
--lang <language> specify language / locale, for example "en-GB"
--proxy-server <proxy> specify proxy server, for example "http://myproxy:3128" or "socks5://myproxy:8080"
--save-storage <filename> save context storage state at the end, for later use with --load-storage
--save-trace <filename> record a trace for the session and save it to a file
--timezone <time zone> time zone to emulate, for example "Europe/Rome"
--timeout <timeout> timeout for Playwright actions in milliseconds (default: "10000")
--user-agent <ua string> specify user agent string
--viewport-size <size> specify browser viewport size in pixels, for example "1280, 720"
-h, --help display help for command

Examples:

$ codegen
$ codegen --target=python
$ codegen -b webkit https://example.com

在上面可以看到有幾個(gè)選項(xiàng),比如

  • -o表示輸出代碼文件的名稱(chēng);
  • –target表示所使用的語(yǔ)言,默認(rèn)是python,即會(huì)生成同步模式的操作代碼,如果傳入的是python-async則會(huì)生成異步模式的操作代碼;
  • -b表示使用的瀏覽器類(lèi)型,默認(rèn)是Chrome瀏覽器;
  • –device可以模擬使用手機(jī)瀏覽器;
  • –lang表示設(shè)置瀏覽器語(yǔ)言,
  • –timeout可以設(shè)置頁(yè)面加載超時(shí)時(shí)間。

了解這些用法之后,我們就來(lái)嘗試啟動(dòng)Chrome瀏覽器,然后將操作結(jié)果輸出到test3.py,命令如下:

playwright codegen -o test3.py --target python-async

可以看到瀏覽器還會(huì)高亮顯示正在操作的節(jié)點(diǎn),同時(shí)還顯示了節(jié)點(diǎn)名稱(chēng)。

在操作的過(guò)程中代碼是實(shí)時(shí)變化的。操作完畢之后即可關(guān)閉瀏覽器,Playwright會(huì)生成一個(gè)test3.py文件,內(nèi)容如下:

import asyncio
from playwright.async_api import Playwright, async_playwright
async def run(playwright: Playwright) -> None:
    browser = await playwright.chromium.launch(headless=False)
    context = await browser.new_context()
    # Open new page
    page = await context.new_page()
    # Go to https://www.baidu.com/
    await page.goto("https://www.baidu.com/")
    # Click input[name="wd"]
    await page.click("input[name=\"wd\"]")
    # Click input[name="wd"]
    await page.click("input[name=\"wd\"]")
    # Fill input[name="wd"]
    await page.fill("input[name=\"wd\"]", "如何榜上富婆")
    # Click text=百度一下
    # async with page.expect_navigation(url="https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%A6%82%E4%BD%95%E6%A6%9C%E4%B8%8A%E5%AF%8C%E5%A9%86&fenlei=256&rsv_pq=ca59e3ec000cf6aa&rsv_t=5f82kcndi6iqNSwqOVo5sd%2BHSoqhzQHKLGVs1HFegxx02UtWAA5gHQbWBfw&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=24&rsv_sug1=14&rsv_sug7=100&rsv_btype=i&prefixsug=%25E5%25A6%2582%25E4%25BD%2595%25E6%25A6%259C%25E4%25B8%258A%25E5%25AF%258C%25E5%25A9%2586&rsp=4&inputT=8686&rsv_sug4=68370&rsv_jmp=fail"):
    async with page.expect_navigation():
        await page.click("text=百度一下")
    # assert page.url == "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%A6%82%E4%BD%95%E6%A6%9C%E4%B8%8A%E5%AF%8C%E5%A9%86&fenlei=256&rsv_pq=ca59e3ec000cf6aa&rsv_t=5f82kcndi6iqNSwqOVo5sd%2BHSoqhzQHKLGVs1HFegxx02UtWAA5gHQbWBfw&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=24&rsv_sug1=14&rsv_sug7=100&rsv_btype=i&prefixsug=%25E5%25A6%2582%25E4%25BD%2595%25E6%25A6%259C%25E4%25B8%258A%25E5%25AF%258C%25E5%25A9%2586&rsp=4&inputT=8686&rsv_sug4=68370"
    # Close page
    await page.close()
    # ---------------------
    await context.close()
    await browser.close()
async def main() -> None:
    async with async_playwright() as playwright:
        await run(playwright)
asyncio.run(main())

可以看到這里的代碼和我們之前編寫(xiě)的代碼基本類(lèi)似,而且也是完全可以運(yùn)行的,運(yùn)行之后就可以看到它又復(fù)現(xiàn)了我們剛才的動(dòng)作。

另外這里的new_page并不是通過(guò)browser調(diào)用的,而是通過(guò)context變量調(diào)用的,context又是通過(guò)Browser對(duì)象調(diào)用的。這里的context變量相當(dāng)于一個(gè)BrowserContext對(duì)象,它是一個(gè)類(lèi)似于隱身模式的獨(dú)立上下文環(huán)境,其運(yùn)行資源是隔離的,保證互不干擾。

選擇器

Playwright的文檔非常的豐富,可以直接參考https://playwright.dev/python/docs/selectors

事件監(jiān)聽(tīng)

page對(duì)象提供了一個(gè)on方法,它可以用來(lái)監(jiān)聽(tīng)頁(yè)面中各個(gè)事件,比如close、console、loadrequest、response等等。

比如我們可以監(jiān)聽(tīng)response事件,response事件可以在每次網(wǎng)絡(luò)請(qǐng)求得到響應(yīng)的時(shí)候觸發(fā),我們可以設(shè)置對(duì)應(yīng)的回調(diào)方法獲取對(duì)應(yīng)的Response的全部信息。

from playwright.sync_api import sync_playwright

def on_response(response):
    print(f'Statue {response.status}:{response.url}')
with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.on('response', on_response)
    page.goto('https://www.kenshujun.cn/')
    page.wait_for_load_state('networkidle')
    browser.close()

創(chuàng)建page對(duì)象之后,就開(kāi)始監(jiān)聽(tīng)response事件,同時(shí)將回調(diào)方法設(shè)置為on_response,on_response對(duì)象接受一個(gè)參數(shù),然后把狀態(tài)碼和連接都輸出來(lái)。

看可以看到這里輸出的結(jié)果與瀏覽器Network面板所加載的內(nèi)容是一樣的。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python的Darts庫(kù)實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)

    Python的Darts庫(kù)實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)

    Darts一個(gè)集統(tǒng)計(jì)、機(jī)器學(xué)習(xí)與深度學(xué)習(xí)模型于一體的Python時(shí)間序列預(yù)測(cè)庫(kù),本文主要介紹了Python的Darts庫(kù)實(shí)現(xiàn)時(shí)間序列預(yù)測(cè),感興趣的可以了解一下
    2025-09-09
  • Python實(shí)現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)

    Python實(shí)現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)

    這篇將以新冠疫情數(shù)據(jù)為例,詳細(xì)介紹了如何利用Python實(shí)現(xiàn)合并Excel文件,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-03-03
  • Python traceback模塊獲取異常信息的使用

    Python traceback模塊獲取異常信息的使用

    Python的traceback模塊提供了多種方法來(lái)獲取和展示異常的堆棧信息,本文主要介紹了Python traceback模塊獲取異常信息的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 使用python3批量下載rbsp數(shù)據(jù)的示例代碼

    使用python3批量下載rbsp數(shù)據(jù)的示例代碼

    這篇文章主要介紹了使用python3批量下載rbsp數(shù)據(jù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • python實(shí)現(xiàn)文件的分割與合并

    python實(shí)現(xiàn)文件的分割與合并

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)文件的分割與合并,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)

    正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)

    這篇文章主要介紹了正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python 協(xié)程中的迭代器,生成器原理及應(yīng)用實(shí)例詳解

    python 協(xié)程中的迭代器,生成器原理及應(yīng)用實(shí)例詳解

    這篇文章主要介紹了python 協(xié)程中的迭代器,生成器原理及應(yīng)用,結(jié)合具體實(shí)例形式詳細(xì)分析了Python協(xié)程中的迭代器,生成器概念、原理及應(yīng)用操作技巧,需要的朋友可以參考下
    2019-10-10
  • python torch.utils.data.DataLoader使用方法

    python torch.utils.data.DataLoader使用方法

    這篇文章主要介紹了python torch.utils.data.DataLoader使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 推薦下python/ironpython:從入門(mén)到精通

    推薦下python/ironpython:從入門(mén)到精通

    推薦下python/ironpython:從入門(mén)到精通...
    2007-10-10
  • Python中的Dataset和Dataloader詳解

    Python中的Dataset和Dataloader詳解

    這篇文章主要介紹了Python中的Dataset和Dataloader詳解,DataLoader與DataSet是PyTorch數(shù)據(jù)讀取的核心,是構(gòu)建一個(gè)可迭代的數(shù)據(jù)裝載器,每次執(zhí)行循環(huán)的時(shí)候,就從中讀取一批Batchsize大小的樣本進(jìn)行訓(xùn)練,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

银川市| 昭苏县| 宁阳县| 涞源县| 新沂市| 永吉县| 隆德县| 邹平县| 高安市| 拜城县| 米脂县| 福清市| 凤庆县| 丰都县| 阜新| 华坪县| 商洛市| 梁平县| 汾西县| 郁南县| 进贤县| 宝兴县| 汉源县| 留坝县| 顺平县| 海门市| 织金县| 黎城县| 伊金霍洛旗| 集贤县| 米易县| 平乡县| 太和县| 乐至县| 泾川县| 榆树市| 蓝山县| 嘉义县| 广平县| 景德镇市| 神池县|