多條告白如次劇本只需引入一次
Playwright是微軟在2020年頭開源的新一代機動化嘗試東西,它的功效一致于Selenium、Pyppeteer等,都不妨啟動欣賞器舉行百般機動化操縱。它的功效也特殊宏大,對市情上的合流欣賞器都供給了扶助,API功效簡略又宏大。固然出生比擬晚,然而此刻興盛得特殊熾熱。
由于Playwright是一個一致Selenium一律不妨扶助網頁頁面襯托的東西,再加上其宏大又簡略的API,Playwright同聲也不妨動作搜集爬蟲的一個爬取兇器。
1.Playwright的特性
Playwright扶助暫時一切合流欣賞器,囊括Chrome和Edge(鑒于Chromium)、Firefox、Safari(鑒于WebKit),供給完備的機動化遏制的API。Playwright扶助挪動端頁面嘗試,運用擺設模仿本領不妨使咱們在挪動Web欣賞器中嘗試相應式Web運用步調。Playwright扶助一切欣賞器的Headless形式和非Headless形式的嘗試。Playwright的安置和擺設特殊大略,安置進程中會機動安置對應的欣賞器和啟動,不須要特殊擺設WebDriver等。Playwright供給了機動等候關系的API,當頁面加載的功夫會機動等候對應的節點加載,大大簡化了API編寫攙雜度。本節咱們就來領會下Playwright的運用本領。
2.安置
Playwright暫時供給了Python和Node.js的API,底下咱們對準Python版的Playwright舉行引見。
要運用Playwright,須要Python3.7本子及之上,請保證Python的本子適合訴求。
要安置Playwright,不妨徑直運用pip3,吩咐如次:
pip3installplaywright安置實行之后須要舉行少許初始化操縱:
playwrightinstall這功夫Playwrigth會安置Chromium,FirefoxandWebKit欣賞器并擺設少許啟動,咱們不用關懷中央擺設的進程,Playwright會為咱們擺設好。
簡直的安置證明不妨參考:https://setup.scrape.center/playwright。
安置實行之后,咱們便不妨運用Playwright啟用Chromium或Firefox或WebKit欣賞器來舉行機動化操縱了。
3.基礎運用
Playwright扶助兩種編寫形式,一種是一致Pyppetter一律的異步形式,另一種是像Selenium一律的同步形式,咱們不妨按照本質須要采用運用各別的形式。
咱們先來看一個基礎同步形式的例子:
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()開始咱們導出了sync_playwright本領,而后徑直挪用了這個本領,該本領歸來的是一個PlaywrightContextManager東西,不妨領會是一個欣賞器左右文處置器,咱們將其賦值為變量p。
接著咱們挪用了PlaywrightContextManager東西的chromium、firefox、webkit屬性順序創造了一個Chromium、Firefox以及Webkit欣賞器范例,接著用一個for輪回順序實行了它們的launch本領,同聲樹立了headless參數為False。
“
提防:即使不樹立為False,默許是無頭形式啟用欣賞器,咱們看不就任何窗口。
”
launch本領歸來的是一個Browser東西,咱們將其賦值為browser變量。而后挪用browser的new_page本領,十分于興建了一個選項卡,歸來的是一個Page東西,將其賦值為page,這所有進程本來和Pyppeteer特殊一致。接著咱們就不妨挪用page的一系列API來舉行百般機動化操縱了,比方挪用goto,即是加載某個頁面,這邊咱們考察的是百度的首頁。接著咱們挪用了page的screenshot本領,參數字傳送一個文獻稱呼,如許截圖就會機動生存為該圖片稱呼,這邊稱呼中咱們介入了browser_type的name屬性,代辦欣賞器的典型,截止辨別即是chromium,firefox,webkit。其余咱們還挪用了title本領,該本領會歸來頁面包車型的士題目,即HTML中title節點中的筆墨,也即是選項卡上的筆墨,咱們將該截止打字與印刷輸入到遏制臺。結果操縱結束,挪用browser的close本領封閉所有欣賞器,運轉中斷。
運轉一下,這功夫咱們不妨看到有三個欣賞器順序啟用并加載了百度這個頁面,辨別是Chromium、Firefox和Webkit三個欣賞器,頁面加載實行之后,天生截圖、遏制臺打字與印刷截止就退出了。
這功夫暫時目次便會天生三個截圖文獻,都是百度的首頁,文獻名中都帶有了欣賞器的稱呼,如圖所示:
遏制臺運轉截止如次:
百度一下,你就領會百度一下,你就領會百度一下,你就領會經過運轉截止咱們不妨創造,咱們特殊簡單地啟用了三種欣賞器并實行了機動化操縱,并經過幾個API就實行了截圖和數據的獲得,所有運轉速率利害常快的,者即是Playwright最最基礎的用法。
固然除去同步形式,Playwright還供給異步的API,即使咱們名目內里運用了asyncio,那就該當運用異步形式,寫法如次:
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())不妨看到所有寫法和同步形式基礎一致,導出的功夫運用的是async_playwright本領,而不復是sync_playwright本領。寫法上增添了async/await要害字的運用,結果的運轉功效是一律的。
其余咱們提防到,這例子中運用了withas語句,with用來左右文東西的處置,它不妨歸來一個左右文處置器,也就對應一個PlaywrightContextManager東西,不管運轉功夫能否拋出特殊,它不妨扶助咱們機動調配而且開釋Playwright的資源。
4.代碼天生
Playwright再有一個宏大的功效,那即是不妨錄制咱們在欣賞器中的操縱并將代碼機動天生出來,有了這個功效,咱們以至都不必寫任何一條龍代碼,這個功效不妨經過playwright吩咐行挪用codegen來實行,咱們先來看看codegen吩咐都有什么參數,輸出如次吩咐:
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代辦輸入的代碼文獻的稱呼;–target代辦運用的談話,默許是python,即會天生同步形式的操縱代碼,即使傳入python-async就會天生異步形式的代碼;-b代辦的是運用的欣賞器,默許是Chromium,其余再有很多樹立,比方–device不妨模仿運用大哥大欣賞器,比方iPhone11,–lang代辦樹立欣賞器的談話,–timeout不妨樹立頁面加載超時功夫。
好,領會了那些用法,那咱們就來試驗啟用一個Firefox欣賞器,而后將操縱截止輸入到script.py文獻,吩咐如次:
playwrightcodegen-oscript.py-bfirefox這功夫就彈出了一個Firefox欣賞器,同聲右側會輸入一個劇本窗口,及時表露暫時操***應的代碼。
咱們不妨在欣賞器中做任何操縱,比方翻開百度,而后點擊輸出框并輸出nba,而后再點擊探求按鈕,欣賞器窗口如次:
不妨瞥見欣賞器中還會高亮表露咱們正在操縱的頁面節點,同聲還表露了對應的采用器字符串input[name=”wd”],右側的窗口如圖所示:
在操縱進程中,該窗口中的代碼就及時變革,不妨看到這邊天生了咱們一系列操縱的對應代碼,比方在探求框中輸出nba,就對應如次代碼:
page.fill("input[name="wd"]","nba")操縱結束之后,封閉欣賞器,Playwright會天生一個script.py文獻,實質如次:
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)不妨看到這邊天生的代碼和咱們之前寫的示例代碼簡直差不離,并且也是實足不妨運轉的,運轉之后就不妨看到它又不妨復現咱們方才所做的操縱了。
以是,有了這個功效,咱們以至都不必編寫任何代碼,只經過大略的可視化點擊就能把代碼天生出來,堪稱利害常簡單了!
其余這邊有一個犯得著提防的點,提防查看下天生的代碼,和前方的例子各別的是,這邊new_page本領并不是徑直經過browser挪用的,而是經過context變量挪用的,這個context又是由browser經過挪用new_context本領天生的。有讀者群大概就會問了,這個context畢竟是做什么的呢?
本來這個context變量對應的是一個BrowserContext東西,BrowserContext是一個一致隱身形式的獨力左右文情況,其運轉資源是獨立分隔的,在做少許機動化嘗試進程中,每個嘗試用例咱們都不妨獨立創造一個BrowserContext東西,如許不妨保護每個嘗試用例之間互不干預,簡直的API不妨參考https://playwright.dev/python/docs/api/class-browsercontext。
5.挪動端欣賞器扶助
Playwright其余一個特性功效即是不妨扶助挪動端欣賞器的模仿,比方模仿翻開iPhone12ProMax上的Safari欣賞器,而后手動樹立定位,并翻開百度輿圖并截圖。開始咱們不妨選定一個經緯度,比仍舊宮的經緯度是39.913904,116.39014,咱們不妨經過geolocation參數傳播給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屬性指定了一臺挪動擺設,這邊傳入的是大哥大的型號,比方iPhone12ProMax,固然也不妨傳其余稱呼,比方iPhone8,Pixel2等。
前方咱們仍舊領會了BrowserContext東西,BrowserContext東西也不妨用來模仿挪動端欣賞器,初始化少許挪動擺設消息、談話、權力、場所等消息,這邊咱們就用它來創造了一個挪動端BrowserContext東西,經過geolocation參數字傳送入了經緯度消息,經過permissions參數字傳送入了付與的權力消息,結果將獲得的BrowserContext東西賦值為context變量。
接著咱們就不妨用BrowserContext東西來興建一個頁面,仍舊挪用new_page本領創造一個新的選項卡,而后跳轉到高德輿圖,并挪用了wait_for_load_state本領等候頁面某個狀況實行,這邊咱們傳入的state是networkidle,也即是搜集清閑狀況。由于在頁面初始化和加載進程中,確定是隨同有搜集乞求的,以是加載進程中確定不算networkidle狀況,以是這邊咱們傳入networkidle就不妨標識暫時頁面和數據加載實行的狀況。加載實行之后,咱們再挪用screenshot本領獲得暫時頁面截圖,結果封閉欣賞器。
運轉下代碼,不妨創造這邊就彈出了一個挪動版欣賞器,而后加載了高德輿圖,并定位到了故宮的場所,如圖所示:
輸入的截圖也是欣賞器中表露的截止。
以是如許咱們就勝利實行了挪動端欣賞器的模仿和少許樹立,其操縱API和PC版欣賞器是實足一律的。
6.采用器
前方咱們提防到click和fill等本領都傳入了一個字符串,那些字符串有的適合CSS采用器的語法,有的又是text=發端的,發覺猶如沒太有順序的格式,它究竟扶助還好嗎的配合準則呢?底下咱們來領會下。
傳入的這個字符串,咱們不妨稱之為ElementSelector,它不只僅扶助CSS采用器、XPath,Playwright還擴充了少許簡單好用的準則,比方徑直按照文本實質挑選,按照節點層級構造挑選之類。
文本采用
文本采用扶助徑直運用text=如許的語法舉行挑選,示比方下:
page.click("text=Login")這就代辦采用文本是Login的節點,并點擊。
CSS采用器
CSS采用器之前也引見過了,比方按照id大概class挑選:
page.click("button")page.click("#nav-bar.contact-us-item")按照一定的節點屬性挑選:
page.click("[data-test=login-button]")page.click("[aria-label='Signin']")CSS采用器+文本
咱們還不妨運用CSS采用器貫串文本值舉行海選,比擬常用的即是has-text和text,前者代辦包括指定的字符串,后者代辦字符串實足配合,示比方下:
page.click("article:has-text('Playwright')")page.click("#nav-bar:text('Contactus')")第一個即是采用文本中包括Playwright的article節點,第二個即是采用id為nav-bar節點華文本值即是Contactus的節點。
CSS采用器+節點聯系
還不妨貫串節點聯系來挑選節點,比方運用has來指定其余一個采用器,示比方下:
page.click(".item-description:has(.item-promo-banner)")比方這邊采用的即是采用class為item-description的節點,且該節點還要包括class為item-promo-banner的子節點。
其余再有少許對立場所聯系,比方right-of不妨指定坐落某個節點右側的節點,示比方下:
page.click("input:right-of(:text('Username'))")這邊采用的即是一個input節點,而且該input節點要坐落文本值為Username的節點的右側。
XPath
固然XPath也是扶助的,然而xpath這個要害字須要咱們自行擬訂,示比方下:
page.click("xpath=//button")這邊須要在發端指定xpath=字符串,代辦反面是一個XPath表白式。
對于更多采用器的用法和最好試驗,不妨參考官方文書檔案:https://playwright.dev/python/docs/selectors。
7.常用操縱本領
上頭咱們領會了欣賞器的少許初始化樹立和基礎的操縱范例,底下咱們再對少許常用的操縱API舉行證明。
罕見的少許API如點擊click,輸出fill等操縱,那些本領都是屬于Page東西的,以是一切的本領都從Page東西的API文書檔案搜索就好了,文書檔案地方:https://playwright.dev/python/docs/api/class-page。
底下引見幾個罕見的API用法。
事變監聽
Page東西供給了一個on本領,它不妨用來監聽頁面中爆發的各個事變,比方close、console、load、request、response之類。
比方這邊咱們不妨監聽response事變,response事變不妨在歷次搜集乞求獲得相應的功夫觸發,咱們不妨樹立對應的回調本領獲得到對應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()這邊咱們在創造Page東西之后,就發端監聽response事變,同聲將回調本領樹立為on_response,on_response東西接受一個參數,而后把Response的狀況碼和鏈接都輸入出來了。
運轉之后,不妨看到遏制臺輸入截止如次:
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“
提防:這邊簡略了局部反復的實質。
”
不妨看到,這邊的輸入截止本來湊巧對應欣賞器Network面板中一切的乞求和相應實質,和下圖是逐一對應的:
這個網站咱們之前領會過,其如實的數據都是Ajax加載的,同聲Ajax乞求中還帶有加密參數,不好簡單獲得。
但有了這個本領,這邊即使咱們想要截獲Ajax乞求,豈不是就特殊簡單了?
改寫一下判決前提,輸入對應的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':['美利堅合眾國']}]}幾乎是得來全不費本領,咱們徑直經過這個本領阻擋了Ajax乞求,徑直把相應截止拿到了,縱然這個Ajax乞求有加密參數,咱們也不必關懷,由于咱們徑直截獲了Ajax結果相應的截止,這對數據爬取來說簡直是太簡單了。
其余再有很多其余的事變監聽,這邊不復逐一引見了,不妨查看官方文書檔案,參考一致的寫法實行。
獲得頁面源碼
要獲得頁面包車型的士HTML代碼本來很大略,咱們徑直經過content本領獲得即可,用法如次:
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()運轉截止即是頁面包車型的士HTML代碼。獲得了HTML代碼之后,咱們經過少許領會東西就不妨索取想要的消息了。
頁面點擊
方才咱們經過示例也領會了頁面點擊的本領,那即是click,這邊精細說一下其運用本領。
頁面點擊的API設置如次:
page.click(selector,**kwargs)這邊不妨看到必傳的參數是selector,其余的參數都是可選的。第一個selector就代辦采用器,不妨用來配合想重心擊的節點,即使傳入的采用器配合了多個節點,那么只會用第一個節點。
這個本領的里面實行論理如次:
按照selector找到配合的節點,即使沒有找到,那就從來等候直到超時,超時功夫不妨由特殊的timeout參數樹立,默許是30秒。等候對該節點的可操縱性查看的截止,比方說即使某個按鈕樹立了不行點擊,那它會等候該按鈕形成了可點擊的功夫才去點擊,只有經過force參數樹立跳過可操縱性查看辦法強迫點擊。即使須要的話,就震動下頁面,將須要被點擊的節點表露出來。挪用page東西的mouse本領,點擊節點重心的場所,即使指定了position參數,那就點擊指定的場所。click本領的少許比擬要害的參數如次:
click_count:點擊度數,默許為1。timeout:等候重心擊的節點的超時功夫,默許是30秒。position:須要傳入一個字典,帶有x和y屬性,代辦點擊場所對立節點左上角的偏移場所。force:縱然不行點擊,那也強迫點擊。默許是False。簡直的API樹立參數不妨參考官方文書檔案:https://playwright.dev/python/docs/api/class-page/#pageclickselector-kwargs。
文本輸出
文本輸出對應的本領是fill,API設置如次:
page.fill(selector,value,**kwargs)這個本領有兩個必傳參數,第一個參數也是selector,第二個參數是value,代辦輸出的實質,其余還不妨經過timeout參數指定對應節點的最長等候功夫。
獲得節點屬性
除去對節點舉行操縱,咱們還不妨獲得節點的屬性,本領即是get_attribute,API設置如次:
page.get_attribute(selector,name,**kwargs)這個本領有兩個必傳參數,第一個參數也是selector,第二個參數是name,代辦要獲得的屬性稱呼,其余還不妨經過timeout參數指定對應節點的最長等候功夫。
示比方下:
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本領,傳入的selector是a.name,選定了class為name的a節點,而后第二個參數字傳送入了href,獲得超鏈接的實質,輸入截止如次:
/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx不妨看到對應href屬性就獲得出來了,但這邊惟有一條截止,由于這邊有個前提,那即是即使傳入的采用器配合了多個節點,那么只會用第一個節點。
那如何獲得一切的節點呢?
獲得多個節點
獲得一切節點不妨運用query_selector_all本領,它不妨歸來節點列表,經過遍歷獲得到單個節點之后,咱們不妨接著挪用單個節點的本領來舉行少許操縱和屬性獲得,示比方下:
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()這邊咱們經過query_selector_all本領獲得了一切配合到的節點,每個節點對應的是一個ElementHandle東西,而后ElementHandle東西也有get_attribute本領來獲得節點屬性,其余還不妨經過text_content本領獲得節點文本。
運轉截止如次:
/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx霸王別姬-FarewellMyConcubine/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIy這個殺手不太冷-Léon/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIz肖申克的救贖-TheShawshankRedemption/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI0泰坦尼克號-Titanic/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI1羅馬假期-RomanHoliday/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI2唐伯虎點秋香-FlirtingScholar/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI3濁世才子-GonewiththeWind/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI4笑劇之王-TheKingofComedy/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI5楚門的寰球-TheTrumanShow/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIxMA==獅子王-TheLionKing獲得單個節點
獲得單個節點也有一定的本領,即是query_selector,即使傳入的采用器配合到多個節點,那它只會歸來第一個節點,示比方下:
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()運轉截止如次:
/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx霸王別姬-FarewellMyConcubine不妨看到這邊只輸入了第一個配合節點的消息。
搜集威脅
結果再引見一個適用的本領route,運用route本領,咱們不妨實行少許搜集威脅和竄改操縱,比方竄改request的屬性,竄改response相應截止等。
看一個范例:
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本領,第一個參數經過正則表白式傳入了配合的URL路途,這邊代辦的是任何包括.png或.jpg的鏈接,遇到如許的乞求,會回調cancel_request本領處置,cancel_request本領不妨接受兩個參數,一個是route,代辦一個CallableRoute東西,其余一個是request,代辦Request東西。這邊咱們徑直挪用了route的abort本領,廢除了這次乞求,以是最?