好用的爬蟲軟件(免費(fèi)網(wǎng)絡(luò)爬蟲工具)

  • 科技
  • 2023-04-26 17:12

多條告白如次劇本只需引入一次

Playwright是微軟在2020年頭開源的新一代機(jī)動化嘗試東西,它的功效一致于Selenium、Pyppeteer等,都不妨啟動欣賞器舉行百般機(jī)動化操縱。它的功效也特殊宏大,對市情上的合流欣賞器都供給了扶助,API功效簡略又宏大。固然出生比擬晚,然而此刻興盛得特殊熾熱。

由于Playwright是一個一致Selenium一律不妨扶助網(wǎng)頁頁面襯托的東西,再加上其宏大又簡略的API,Playwright同聲也不妨動作搜集爬蟲的一個爬取兇器。

1.Playwright的特性

Playwright扶助暫時一切合流欣賞器,囊括Chrome和Edge(鑒于Chromium)、Firefox、Safari(鑒于WebKit),供給完備的機(jī)動化遏制的API。Playwright扶助挪動端頁面嘗試,運(yùn)用擺設(shè)模仿本領(lǐng)不妨使咱們在挪動Web欣賞器中嘗試相應(yīng)式Web運(yùn)用步調(diào)。Playwright扶助一切欣賞器的Headless形式和非Headless形式的嘗試。Playwright的安置和擺設(shè)特殊大略,安置進(jìn)程中會機(jī)動安置對應(yīng)的欣賞器和啟動,不須要特殊擺設(shè)WebDriver等。Playwright供給了機(jī)動等候關(guān)系的API,當(dāng)頁面加載的功夫會機(jī)動等候?qū)?yīng)的節(jié)點(diǎn)加載,大大簡化了API編寫攙雜度。本節(jié)咱們就來領(lǐng)會下Playwright的運(yùn)用本領(lǐng)。

2.安置

Playwright暫時供給了Python和Node.js的API,底下咱們對準(zhǔn)Python版的Playwright舉行引見。

要運(yùn)用Playwright,須要Python3.7本子及之上,請保證Python的本子適合訴求。

要安置Playwright,不妨徑直運(yùn)用pip3,吩咐如次:

pip3installplaywright安置實行之后須要舉行少許初始化操縱:

playwrightinstall這功夫Playwrigth會安置Chromium,FirefoxandWebKit欣賞器并擺設(shè)少許啟動,咱們不用關(guān)懷中央擺設(shè)的進(jìn)程,Playwright會為咱們擺設(shè)好。

簡直的安置證明不妨參考:https://setup.scrape.center/playwright。

安置實行之后,咱們便不妨運(yùn)用Playwright啟用Chromium或Firefox或WebKit欣賞器來舉行機(jī)動化操縱了。

3.基礎(chǔ)運(yùn)用

Playwright扶助兩種編寫形式,一種是一致Pyppetter一律的異步形式,另一種是像Selenium一律的同步形式,咱們不妨按照本質(zhì)須要采用運(yùn)用各別的形式。

咱們先來看一個基礎(chǔ)同步形式的例子:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:forbrowser_typein[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本領(lǐng),而后徑直挪用了這個本領(lǐng),該本領(lǐng)歸來的是一個PlaywrightContextManager東西,不妨領(lǐng)會是一個欣賞器左右文處置器,咱們將其賦值為變量p。

接著咱們挪用了PlaywrightContextManager東西的chromium、firefox、webkit屬性順序創(chuàng)造了一個Chromium、Firefox以及Webkit欣賞器范例,接著用一個for輪回順序?qū)嵭辛怂鼈兊膌aunch本領(lǐng),同聲樹立了headless參數(shù)為False。

提防:即使不樹立為False,默許是無頭形式啟用欣賞器,咱們看不就任何窗口。

launch本領(lǐng)歸來的是一個Browser東西,咱們將其賦值為browser變量。而后挪用browser的new_page本領(lǐng),十分于興建了一個選項卡,歸來的是一個Page東西,將其賦值為page,這所有進(jìn)程本來和Pyppeteer特殊一致。接著咱們就不妨挪用page的一系列API來舉行百般機(jī)動化操縱了,比方挪用goto,即是加載某個頁面,這邊咱們考察的是百度的首頁。接著咱們挪用了page的screenshot本領(lǐng),參數(shù)字傳送一個文獻(xiàn)稱呼,如許截圖就會機(jī)動生存為該圖片稱呼,這邊稱呼中咱們介入了browser_type的name屬性,代辦欣賞器的典型,截止辨別即是chromium,firefox,webkit。其余咱們還挪用了title本領(lǐng),該本領(lǐng)會歸來頁面包車型的士題目,即HTML中title節(jié)點(diǎn)中的筆墨,也即是選項卡上的筆墨,咱們將該截止打字與印刷輸入到遏制臺。結(jié)果操縱結(jié)束,挪用browser的close本領(lǐng)封閉所有欣賞器,運(yùn)轉(zhuǎn)中斷。

運(yùn)轉(zhuǎn)一下,這功夫咱們不妨看到有三個欣賞器順序啟用并加載了百度這個頁面,辨別是Chromium、Firefox和Webkit三個欣賞器,頁面加載實行之后,天生截圖、遏制臺打字與印刷截止就退出了。

這功夫暫時目次便會天生三個截圖文獻(xiàn),都是百度的首頁,文獻(xiàn)名中都帶有了欣賞器的稱呼,如圖所示:

遏制臺運(yùn)轉(zhuǎn)截止如次:

百度一下,你就領(lǐng)會百度一下,你就領(lǐng)會百度一下,你就領(lǐng)會經(jīng)過運(yùn)轉(zhuǎn)截止咱們不妨創(chuàng)造,咱們特殊簡單地啟用了三種欣賞器并實行了機(jī)動化操縱,并經(jīng)過幾個API就實行了截圖和數(shù)據(jù)的獲得,所有運(yùn)轉(zhuǎn)速率利害常快的,者即是Playwright最最基礎(chǔ)的用法。

固然除去同步形式,Playwright還供給異步的API,即使咱們名目內(nèi)里運(yùn)用了asyncio,那就該當(dāng)運(yùn)用異步形式,寫法如次:

importasynciofromplaywright.async_apiimportasync_playwrightasyncdefmain():asyncwithasync_playwright()asp:forbrowser_typein[p.chromium,p.firefox,p.webkit]:browser=awaitbrowser_type.launch()page=awaitbrowser.new_page()awaitpage.goto('https://www.baidu.com')awaitpage.screenshot(path=f'screenshot-{browser_type.name}.png')print(awaitpage.title())awaitbrowser.close()asyncio.run(main())不妨看到所有寫法和同步形式基礎(chǔ)一致,導(dǎo)出的功夫運(yùn)用的是async_playwright本領(lǐng),而不復(fù)是sync_playwright本領(lǐng)。寫法上增添了async/await要害字的運(yùn)用,結(jié)果的運(yùn)轉(zhuǎn)功效是一律的。

其余咱們提防到,這例子中運(yùn)用了withas語句,with用來左右文東西的處置,它不妨歸來一個左右文處置器,也就對應(yīng)一個PlaywrightContextManager東西,不管運(yùn)轉(zhuǎn)功夫能否拋出特殊,它不妨扶助咱們機(jī)動調(diào)配而且開釋Playwright的資源。

4.代碼天生

Playwright再有一個宏大的功效,那即是不妨錄制咱們在欣賞器中的操縱并將代碼機(jī)動天生出來,有了這個功效,咱們以至都不必寫任何一條龍代碼,這個功效不妨經(jīng)過playwright吩咐行挪用codegen來實行,咱們先來看看codegen吩咐都有什么參數(shù),輸出如次吩咐:

playwrightcodegen--help截止一致如次:

Usage:npxplaywrightcodegen[options][url]openpageandgeneratecodeforuseractionsOptions:-o,--output<filename>savesthegeneratedscripttoafile--target<language>languagetouse,oneofjavascript,python,python-async,csharp(default:"python")-b,--browser<browserType>browsertouse,oneofcr,chromium,ff,firefox,wk,webkit(default:"chromium")--channel<channel>Chromiumdistributionchannel,"chrome","chrome-beta","msedge-dev",etc--color-scheme<scheme>emulatepreferredcolorscheme,"light"or"dark"--device<deviceName>emulatedevice,forexample"iPhone11"--geolocation<coordinates>specifygeolocationcoordinates,forexample"37.819722,-122.478611"--load-storage<filename>loadcontextstoragestatefromthefile,previouslysavedwith--save-storage--lang<language>specifylanguage/locale,forexample"en-GB"--proxy-server<proxy>specifyproxyserver,forexample"http://myproxy:3128"or"socks5://myproxy:8080"--save-storage<filename>savecontextstoragestateattheend,forlaterusewith--load-storage--timezone<timezone>timezonetoemulate,forexample"Europe/Rome"--timeout<timeout>timeoutforPlaywrightactionsinmilliseconds(default:"10000")--user-agent<uastring>specifyuseragentstring--viewport-size<size>specifybrowserviewportsizeinpixels,forexample"1280,720"-h,--helpdisplayhelpforcommandExamples:$codegen$codegen--target=python$codegen-bwebkithttps://example.com不妨看到這邊有幾個選項,比方-o代辦輸入的代碼文獻(xiàn)的稱呼;–target代辦運(yùn)用的談話,默許是python,即會天生同步形式的操縱代碼,即使傳入python-async就會天生異步形式的代碼;-b代辦的是運(yùn)用的欣賞器,默許是Chromium,其余再有很多樹立,比方–device不妨模仿運(yùn)用大哥大欣賞器,比方iPhone11,–lang代辦樹立欣賞器的談話,–timeout不妨樹立頁面加載超時功夫。

好,領(lǐng)會了那些用法,那咱們就來試驗啟用一個Firefox欣賞器,而后將操縱截止輸入到script.py文獻(xiàn),吩咐如次:

playwrightcodegen-oscript.py-bfirefox這功夫就彈出了一個Firefox欣賞器,同聲右側(cè)會輸入一個劇本窗口,及時表露暫時操***應(yīng)的代碼。

咱們不妨在欣賞器中做任何操縱,比方翻開百度,而后點(diǎn)擊輸出框并輸出nba,而后再點(diǎn)擊探求按鈕,欣賞器窗口如次:

不妨瞥見欣賞器中還會高亮表露咱們正在操縱的頁面節(jié)點(diǎn),同聲還表露了對應(yīng)的采用器字符串input[name=”wd”],右側(cè)的窗口如圖所示:

在操縱進(jìn)程中,該窗口中的代碼就及時變革,不妨看到這邊天生了咱們一系列操縱的對應(yīng)代碼,比方在探求框中輸出nba,就對應(yīng)如次代碼:

page.fill("input[name="wd"]","nba")操縱結(jié)束之后,封閉欣賞器,Playwright會天生一個script.py文獻(xiàn),實質(zhì)如次:

fromplaywright.sync_apiimportsync_playwrightdefrun(playwright):browser=playwright.firefox.launch(headless=False)context=browser.new_context()#Opennewpagepage=context.new_page()#Gotohttps://www.baidu.com/page.goto("https://www.baidu.com/")#Clickinput[name="wd"]page.click("input[name="wd"]")#Fillinput[name="wd"]page.fill("input[name="wd"]","nba")#Clicktext=百度一下withpage.expect_navigation():page.click("text=百度一下")context.close()browser.close()withsync_playwright()asplaywright:run(playwright)不妨看到這邊天生的代碼和咱們之前寫的示例代碼簡直差不離,并且也是實足不妨運(yùn)轉(zhuǎn)的,運(yùn)轉(zhuǎn)之后就不妨看到它又不妨復(fù)現(xiàn)咱們方才所做的操縱了。

以是,有了這個功效,咱們以至都不必編寫任何代碼,只經(jīng)過大略的可視化點(diǎn)擊就能把代碼天生出來,堪稱利害常簡單了!

其余這邊有一個犯得著提防的點(diǎn),提防查看下天生的代碼,和前方的例子各別的是,這邊new_page本領(lǐng)并不是徑直經(jīng)過browser挪用的,而是經(jīng)過context變量挪用的,這個context又是由browser經(jīng)過挪用new_context本領(lǐng)天生的。有讀者群大概就會問了,這個context畢竟是做什么的呢?

本來這個context變量對應(yīng)的是一個BrowserContext東西,BrowserContext是一個一致隱身形式的獨(dú)力左右文情況,其運(yùn)轉(zhuǎn)資源是獨(dú)立分隔的,在做少許機(jī)動化嘗試進(jìn)程中,每個嘗試用例咱們都不妨獨(dú)立創(chuàng)造一個BrowserContext東西,如許不妨保護(hù)每個嘗試用例之間互不干預(yù),簡直的API不妨參考https://playwright.dev/python/docs/api/class-browsercontext。

5.挪動端欣賞器扶助

Playwright其余一個特性功效即是不妨扶助挪動端欣賞器的模仿,比方模仿翻開iPhone12ProMax上的Safari欣賞器,而后手動樹立定位,并翻開百度輿圖并截圖。開始咱們不妨選定一個經(jīng)緯度,比仍舊宮的經(jīng)緯度是39.913904,116.39014,咱們不妨經(jīng)過geolocation參數(shù)傳播給Webkit欣賞器并初始化。

示例代碼如次:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:iphone_12_pro_max=p.devices['iPhone12ProMax']browser=p.webkit.launch(headless=False)context=browser.new_context(**iphone_12_pro_max,locale='zh-CN',geolocation={'longitude':116.39014,'latitude':39.913904},permissions=['geolocation'])page=context.new_page()page.goto('https://amap.com')page.wait_for_load_state(state='networkidle')page.screenshot(path='location-iphone.png')browser.close()這邊咱們先用PlaywrightContextManager東西的devices屬性指定了一臺挪動擺設(shè),這邊傳入的是大哥大的型號,比方iPhone12ProMax,固然也不妨傳其余稱呼,比方iPhone8,Pixel2等。

前方咱們?nèi)耘f領(lǐng)會了BrowserContext東西,BrowserContext東西也不妨用來模仿挪動端欣賞器,初始化少許挪動擺設(shè)消息、談話、權(quán)力、場所等消息,這邊咱們就用它來創(chuàng)造了一個挪動端BrowserContext東西,經(jīng)過geolocation參數(shù)字傳送入了經(jīng)緯度消息,經(jīng)過permissions參數(shù)字傳送入了付與的權(quán)力消息,結(jié)果將獲得的BrowserContext東西賦值為context變量。

接著咱們就不妨用BrowserContext東西來興建一個頁面,仍舊挪用new_page本領(lǐng)創(chuàng)造一個新的選項卡,而后跳轉(zhuǎn)到高德輿圖,并挪用了wait_for_load_state本領(lǐng)等候頁面某個狀況實行,這邊咱們傳入的state是networkidle,也即是搜集清閑狀況。由于在頁面初始化和加載進(jìn)程中,確定是隨同有搜集乞求的,以是加載進(jìn)程中確定不算networkidle狀況,以是這邊咱們傳入networkidle就不妨標(biāo)識暫時頁面和數(shù)據(jù)加載實行的狀況。加載實行之后,咱們再挪用screenshot本領(lǐng)獲得暫時頁面截圖,結(jié)果封閉欣賞器。

運(yùn)轉(zhuǎn)下代碼,不妨創(chuàng)造這邊就彈出了一個挪動版欣賞器,而后加載了高德輿圖,并定位到了故宮的場所,如圖所示:

輸入的截圖也是欣賞器中表露的截止。

以是如許咱們就勝利實行了挪動端欣賞器的模仿和少許樹立,其操縱API和PC版欣賞器是實足一律的。

6.采用器

前方咱們提防到click和fill等本領(lǐng)都傳入了一個字符串,那些字符串有的適合CSS采用器的語法,有的又是text=發(fā)端的,發(fā)覺猶如沒太有順序的格式,它究竟扶助還好嗎的配合準(zhǔn)則呢?底下咱們來領(lǐng)會下。

傳入的這個字符串,咱們不妨稱之為ElementSelector,它不只僅扶助CSS采用器、XPath,Playwright還擴(kuò)充了少許簡單好用的準(zhǔn)則,比方徑直按照文本實質(zhì)挑選,按照節(jié)點(diǎn)層級構(gòu)造挑選之類。

文本采用

文本采用扶助徑直運(yùn)用text=如許的語法舉行挑選,示比方下:

page.click("text=Login")這就代辦采用文本是Login的節(jié)點(diǎn),并點(diǎn)擊。

CSS采用器

CSS采用器之前也引見過了,比方按照id大概class挑選:

page.click("button")page.click("#nav-bar.contact-us-item")按照一定的節(jié)點(diǎn)屬性挑選:

page.click("[data-test=login-button]")page.click("[aria-label='Signin']")CSS采用器+文本

咱們還不妨運(yùn)用CSS采用器貫串文本值舉行海選,比擬常用的即是has-text和text,前者代辦包括指定的字符串,后者代辦字符串實足配合,示比方下:

page.click("article:has-text('Playwright')")page.click("#nav-bar:text('Contactus')")第一個即是采用文本中包括Playwright的article節(jié)點(diǎn),第二個即是采用id為nav-bar節(jié)點(diǎn)華文本值即是Contactus的節(jié)點(diǎn)。

CSS采用器+節(jié)點(diǎn)聯(lián)系

還不妨貫串節(jié)點(diǎn)聯(lián)系來挑選節(jié)點(diǎn),比方運(yùn)用has來指定其余一個采用器,示比方下:

page.click(".item-description:has(.item-promo-banner)")比方這邊采用的即是采用class為item-description的節(jié)點(diǎn),且該節(jié)點(diǎn)還要包括class為item-promo-banner的子節(jié)點(diǎn)。

其余再有少許對立場所聯(lián)系,比方right-of不妨指定坐落某個節(jié)點(diǎn)右側(cè)的節(jié)點(diǎn),示比方下:

page.click("input:right-of(:text('Username'))")這邊采用的即是一個input節(jié)點(diǎn),而且該input節(jié)點(diǎn)要坐落文本值為Username的節(jié)點(diǎn)的右側(cè)。

XPath

固然XPath也是扶助的,然而xpath這個要害字須要咱們自行擬訂,示比方下:

page.click("xpath=//button")這邊須要在發(fā)端指定xpath=字符串,代辦反面是一個XPath表白式。

對于更多采用器的用法和最好試驗,不妨參考官方文書檔案:https://playwright.dev/python/docs/selectors。

7.常用操縱本領(lǐng)

上頭咱們領(lǐng)會了欣賞器的少許初始化樹立和基礎(chǔ)的操縱范例,底下咱們再對少許常用的操縱API舉行證明。

罕見的少許API如點(diǎn)擊click,輸出fill等操縱,那些本領(lǐng)都是屬于Page東西的,以是一切的本領(lǐng)都從Page東西的API文書檔案搜索就好了,文書檔案地方:https://playwright.dev/python/docs/api/class-page。

底下引見幾個罕見的API用法。

事變監(jiān)聽

Page東西供給了一個on本領(lǐng),它不妨用來監(jiān)聽頁面中爆發(fā)的各個事變,比方close、console、load、request、response之類。

比方這邊咱們不妨監(jiān)聽response事變,response事變不妨在歷次搜集乞求獲得相應(yīng)的功夫觸發(fā),咱們不妨樹立對應(yīng)的回調(diào)本領(lǐng)獲得到對應(yīng)Response的十足消息,示比方下:

fromplaywright.sync_apiimportsync_playwrightdefon_response(response):print(f'Statue{response.status}:{response.url}')withsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.on('response',on_response)page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')browser.close()這邊咱們在創(chuàng)造Page東西之后,就發(fā)端監(jiān)聽response事變,同聲將回調(diào)本領(lǐng)樹立為on_response,on_response東西接受一個參數(shù),而后把Response的狀況碼和鏈接都輸入出來了。

運(yùn)轉(zhuǎn)之后,不妨看到遏制臺輸入截止如次:

Statue200:https://spa6.scrape.center/Statue200:https://spa6.scrape.center/css/app.ea9d802a.cssStatue200:https://spa6.scrape.center/js/app.5ef0d454.jsStatue200:https://spa6.scrape.center/js/chunk-vendors.77daf991.jsStatue200:https://spa6.scrape.center/css/chunk-19c920f8.2a6496e0.css...Statue200:https://spa6.scrape.center/css/chunk-19c920f8.2a6496e0.cssStatue200:https://spa6.scrape.center/js/chunk-19c920f8.c3a1129d.jsStatue200:https://spa6.scrape.center/img/logo.a508a8f0.pngStatue200:https://spa6.scrape.center/fonts/element-icons.535877f5.woffStatue301:https://spa6.scrape.center/api/movie?limit=10&offset=0&token=NGMwMzFhNGEzMTFiMzJkOGE0ZTQ1YjUzMTc2OWNiYTI1Yzk0ZDM3MSwxNjIyOTE4NTE5Statue200:https://spa6.scrape.center/api/movie/?limit=10&offset=0&token=NGMwMzFhNGEzMTFiMzJkOGE0ZTQ1YjUzMTc2OWNiYTI1Yzk0ZDM3MSwxNjIyOTE4NTE5Statue200:https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@464w_644h_1e_1cStatue200:https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@464w_644h_1e_1c....Statue200:https://p1.meituan.net/movie/b607fba7513e7f15eab170aac1e1400d878112.jpg@464w_644h_1e_1c“

提防:這邊簡略了局部反復(fù)的實質(zhì)。

不妨看到,這邊的輸入截止本來湊巧對應(yīng)欣賞器Network面板中一切的乞求和相應(yīng)實質(zhì),和下圖是逐一對應(yīng)的:

這個網(wǎng)站咱們之前領(lǐng)會過,其如實的數(shù)據(jù)都是Ajax加載的,同聲Ajax乞求中還帶有加密參數(shù),不好簡單獲得。

但有了這個本領(lǐng),這邊即使咱們想要截獲Ajax乞求,豈不是就特殊簡單了?

改寫一下判決前提,輸入對應(yīng)的JSON截止,改寫如次:

fromplaywright.sync_apiimportsync_playwrightdefon_response(response):if'/api/movie/'inresponse.urlandresponse.status==200:print(response.json())withsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.on('response',on_response)page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')browser.close()遏制臺輸出如次:

{'count':100,'results':[{'id':1,'name':'霸王別姬','alias':'FarewellMyConcubine','cover':'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c','categories':['劇情','戀情'],'published_at':'1993-07-26','minute':171,'score':9.5,'regions':['華夏陸地','華夏香港']},...'published_at':None,'minute':103,'score':9.0,'regions':['美利堅合眾國']},{'id':10,'name':'獅子王','alias':'TheLionKing','cover':'https://p0.meituan.net/movie/27b76fe6cf3903f3d74963f70786001e1438406.jpg@464w_644h_1e_1c','categories':['動畫','輕歌曼舞','浮夸'],'published_at':'1995-07-15','minute':89,'score':9.0,'regions':['美利堅合眾國']}]}幾乎是得來全不費(fèi)本領(lǐng),咱們徑直經(jīng)過這個本領(lǐng)阻擋了Ajax乞求,徑直把相應(yīng)截止拿到了,縱然這個Ajax乞求有加密參數(shù),咱們也不必關(guān)懷,由于咱們徑直截獲了Ajax結(jié)果相應(yīng)的截止,這對數(shù)據(jù)爬取來說簡直是太簡單了。

其余再有很多其余的事變監(jiān)聽,這邊不復(fù)逐一引見了,不妨查看官方文書檔案,參考一致的寫法實行。

獲得頁面源碼

要獲得頁面包車型的士HTML代碼本來很大略,咱們徑直經(jīng)過content本領(lǐng)獲得即可,用法如次:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')html=page.content()print(html)browser.close()運(yùn)轉(zhuǎn)截止即是頁面包車型的士HTML代碼。獲得了HTML代碼之后,咱們經(jīng)過少許領(lǐng)會東西就不妨索取想要的消息了。

頁面點(diǎn)擊

方才咱們經(jīng)過示例也領(lǐng)會了頁面點(diǎn)擊的本領(lǐng),那即是click,這邊精細(xì)說一下其運(yùn)用本領(lǐng)。

頁面點(diǎn)擊的API設(shè)置如次:

page.click(selector,**kwargs)這邊不妨看到必傳的參數(shù)是selector,其余的參數(shù)都是可選的。第一個selector就代辦采用器,不妨用來配合想重心擊的節(jié)點(diǎn),即使傳入的采用器配合了多個節(jié)點(diǎn),那么只會用第一個節(jié)點(diǎn)。

這個本領(lǐng)的里面實行論理如次:

按照selector找到配合的節(jié)點(diǎn),即使沒有找到,那就從來等候直到超時,超時功夫不妨由特殊的timeout參數(shù)樹立,默許是30秒。等候?qū)υ摴?jié)點(diǎn)的可操縱性查看的截止,比方說即使某個按鈕樹立了不行點(diǎn)擊,那它會等候該按鈕形成了可點(diǎn)擊的功夫才去點(diǎn)擊,只有經(jīng)過force參數(shù)樹立跳過可操縱性查看辦法強(qiáng)迫點(diǎn)擊。即使須要的話,就震動下頁面,將須要被點(diǎn)擊的節(jié)點(diǎn)表露出來。挪用page東西的mouse本領(lǐng),點(diǎn)擊節(jié)點(diǎn)重心的場所,即使指定了position參數(shù),那就點(diǎn)擊指定的場所。click本領(lǐng)的少許比擬要害的參數(shù)如次:

click_count:點(diǎn)擊度數(shù),默許為1。timeout:等候重心擊的節(jié)點(diǎn)的超時功夫,默許是30秒。position:須要傳入一個字典,帶有x和y屬性,代辦點(diǎn)擊場所對立節(jié)點(diǎn)左上角的偏移場所。force:縱然不行點(diǎn)擊,那也強(qiáng)迫點(diǎn)擊。默許是False。簡直的API樹立參數(shù)不妨參考官方文書檔案:https://playwright.dev/python/docs/api/class-page/#pageclickselector-kwargs。

文本輸出

文本輸出對應(yīng)的本領(lǐng)是fill,API設(shè)置如次:

page.fill(selector,value,**kwargs)這個本領(lǐng)有兩個必傳參數(shù),第一個參數(shù)也是selector,第二個參數(shù)是value,代辦輸出的實質(zhì),其余還不妨經(jīng)過timeout參數(shù)指定對應(yīng)節(jié)點(diǎn)的最長等候功夫。

獲得節(jié)點(diǎn)屬性

除去對節(jié)點(diǎn)舉行操縱,咱們還不妨獲得節(jié)點(diǎn)的屬性,本領(lǐng)即是get_attribute,API設(shè)置如次:

page.get_attribute(selector,name,**kwargs)這個本領(lǐng)有兩個必傳參數(shù),第一個參數(shù)也是selector,第二個參數(shù)是name,代辦要獲得的屬性稱呼,其余還不妨經(jīng)過timeout參數(shù)指定對應(yīng)節(jié)點(diǎn)的最長等候功夫。

示比方下:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')href=page.get_attribute('a.name','href')print(href)browser.close()這邊咱們挪用了get_attribute本領(lǐng),傳入的selector是a.name,選定了class為name的a節(jié)點(diǎn),而后第二個參數(shù)字傳送入了href,獲得超鏈接的實質(zhì),輸入截止如次:

/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx不妨看到對應(yīng)href屬性就獲得出來了,但這邊惟有一條截止,由于這邊有個前提,那即是即使傳入的采用器配合了多個節(jié)點(diǎn),那么只會用第一個節(jié)點(diǎn)。

那如何獲得一切的節(jié)點(diǎn)呢?

獲得多個節(jié)點(diǎn)

獲得一切節(jié)點(diǎn)不妨運(yùn)用query_selector_all本領(lǐng),它不妨歸來節(jié)點(diǎn)列表,經(jīng)過遍歷獲得到單個節(jié)點(diǎn)之后,咱們不妨接著挪用單個節(jié)點(diǎn)的本領(lǐng)來舉行少許操縱和屬性獲得,示比方下:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')elements=page.query_selector_all('a.name')forelementinelements:print(element.get_attribute('href'))print(element.text_content())browser.close()這邊咱們經(jīng)過query_selector_all本領(lǐng)獲得了一切配合到的節(jié)點(diǎn),每個節(jié)點(diǎn)對應(yīng)的是一個ElementHandle東西,而后ElementHandle東西也有g(shù)et_attribute本領(lǐng)來獲得節(jié)點(diǎn)屬性,其余還不妨經(jīng)過text_content本領(lǐng)獲得節(jié)點(diǎn)文本。

運(yùn)轉(zhuǎn)截止如次:

/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx霸王別姬-FarewellMyConcubine/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIy這個殺手不太冷-Léon/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIz肖申克的救贖-TheShawshankRedemption/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI0泰坦尼克號-Titanic/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI1羅馬假期-RomanHoliday/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI2唐伯虎點(diǎn)秋香-FlirtingScholar/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI3濁世才子-GonewiththeWind/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI4笑劇之王-TheKingofComedy/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI5楚門的寰球-TheTrumanShow/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIxMA==獅子王-TheLionKing獲得單個節(jié)點(diǎn)

獲得單個節(jié)點(diǎn)也有一定的本領(lǐng),即是query_selector,即使傳入的采用器配合到多個節(jié)點(diǎn),那它只會歸來第一個節(jié)點(diǎn),示比方下:

fromplaywright.sync_apiimportsync_playwrightwithsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()page.goto('https://spa6.scrape.center/')page.wait_for_load_state('networkidle')element=page.query_selector('a.name')print(element.get_attribute('href'))print(element.text_content())browser.close()運(yùn)轉(zhuǎn)截止如次:

/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx霸王別姬-FarewellMyConcubine不妨看到這邊只輸入了第一個配合節(jié)點(diǎn)的消息。

搜集威脅

結(jié)果再引見一個適用的本領(lǐng)route,運(yùn)用route本領(lǐng),咱們不妨實行少許搜集威脅和竄改操縱,比方竄改request的屬性,竄改response相應(yīng)截止等。

看一個范例:

fromplaywright.sync_apiimportsync_playwrightimportrewithsync_playwright()asp:browser=p.chromium.launch(headless=False)page=browser.new_page()defcancel_request(route,request):route.abort()page.route(re.compile(r"(.png)|(.jpg)"),cancel_request)page.goto("https://spa6.scrape.center/")page.wait_for_load_state('networkidle')page.screenshot(path='no_picture.png')browser.close()這邊咱們挪用了route本領(lǐng),第一個參數(shù)經(jīng)過正則表白式傳入了配合的URL路途,這邊代辦的是任何包括.png或.jpg的鏈接,遇到如許的乞求,會回調(diào)cancel_request本領(lǐng)處置,cancel_request本領(lǐng)不妨接受兩個參數(shù),一個是route,代辦一個CallableRoute東西,其余一個是request,代辦Request東西。這邊咱們徑直挪用了route的abort本領(lǐng),廢除了這次乞求,以是最?

猜你喜歡

主站蜘蛛池模板: 久久午夜无码免费| 亚洲av激情无码专区在线播放| 中文字幕无码AV波多野吉衣| 中字无码av电影在线观看网站 | 亚洲动漫精品无码av天堂| 日韩精品无码人成视频手机| 无码人妻视频一区二区三区| 亚洲AV无码资源在线观看| 国产丝袜无码一区二区视频| a级毛片无码免费真人| 中文字幕丰满乱子伦无码专区| 久久久无码人妻精品无码| 无码人妻一区二区三区精品视频 | 亚洲AV成人无码久久WWW| 亚洲国产AV无码一区二区三区| 色综合热无码热国产| 亚洲乱亚洲乱妇无码麻豆| 好了av第四综合无码久久| 亚洲国产精品成人精品无码区在线| 亚洲熟妇无码AV不卡在线播放| 亚洲av无码国产精品色在线看不卡| 无码人妻黑人中文字幕| 无码福利写真片视频在线播放| 无码专区一va亚洲v专区在线| 久久精品中文字幕无码绿巨人 | 中文字幕av无码无卡免费 | 亚洲AV无码国产精品永久一区| 日韩精品无码免费专区午夜不卡| 亚洲Aⅴ在线无码播放毛片一线天| HEYZO无码综合国产精品| 无码熟妇人妻AV影音先锋| 无码av免费一区二区三区试看 | 全免费a级毛片免费看无码| 欧洲精品久久久av无码电影| 日韩精品无码一区二区三区AV| 亚洲人成无码网WWW| 性色AV一区二区三区无码| 亚洲av无码有乱码在线观看| 亚洲AV无码一区二区三区人| 日韩人妻精品无码一区二区三区| 潮喷大喷水系列无码久久精品|