好用的爬虫软件(免费网络爬虫工具)

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

多条告白如次剧本只需引入一次

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本领,废除了这次乞求,以是最?

猜你喜欢