好用的爬虫软件(免费网络爬虫工具)
多条告白如次剧本只需引入一次
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,须要 Python 3.7 本子及之上,请保证 Python 的本子适合诉求。
要安置 Playwright,不妨径直运用 pip3,吩咐如次:
pip3 install playwright安置实行之后须要举行少许初始化操纵:
playwright install这功夫 Playwrigth 会安置 Chromium, Firefox and WebKit 欣赏器并摆设少许启动,咱们不用关怀中央摆设的进程,Playwright 会为咱们摆设好。
简直的安置证明不妨参考:https://setup.scrape.center/playwright 。
安置实行之后,咱们便不妨运用 Playwright 启用 Chromium 或 Firefox 或 WebKit 欣赏器来举行机动化操纵了。
3. 基础运用
Playwright 扶助两种编写形式,一种是一致 Pyppetter 一律的异步形式,另一种是像 Selenium 一律的同步形式,咱们不妨按照本质须要采用运用各别的形式。
咱们先来看一个基础同步形式的例子:
from playwright.sync_api import sync_playwrightwith 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()开始咱们导出了 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,那就该当运用异步形式,写法如次:
import asynciofrom playwright.async_api import async_playwrightasync 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())不妨看到所有写法和同步形式基础一致,导出的功夫运用的是 async_playwright 本领,而不复是 sync_playwright 本领。写法上增添了 async/await 要害字的运用,结果的运转功效是一律的。
其余咱们提防到,这例子中运用了 with as 语句,with 用来左右文东西的处置,它不妨归来一个左右文处置器,也就对应一个 PlaywrightContextManager 东西,不管运转功夫能否抛出特殊,它不妨扶助咱们机动调配而且开释 Playwright 的资源。
4. 代码天生
Playwright 再有一个宏大的功效,那即是不妨录制咱们在欣赏器中的操纵并将代码机动天生出来,有了这个功效,咱们以至都不必写任何一条龙代码,这个功效不妨经过 playwright 吩咐行挪用 codegen 来实行,咱们先来看看 codegen 吩咐都有什么参数,输出如次吩咐:
playwright codegen --help截止一致如次:
Usage: npx playwright codegen ***;options] ***;url]open page and generate code for user actionsOptions: -o, --output <file name> saves the generated script to a file --target <language> language to use, one of javascript, 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" --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 --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 commandExamples: $ codegen $ codegen --target=python $ codegen -b webkit https://example.com不妨看到这边有几个选项,比方 -o 代办输入的代码文献的称呼;–target 代办运用的谈话,默许是 python,即会天生同步形式的操纵代码,即使传入 python-async 就会天生异步形式的代码;-b 代办的是运用的欣赏器,默许是 Chromium,其余再有很多树立,比方 –device 不妨模仿运用大哥大欣赏器,比方 iPhone 11,–lang 代办树立欣赏器的谈话,–timeout 不妨树立页面加载超时功夫。
好,领会了那些用法,那咱们就来试验启用一个 Firefox 欣赏器,而后将操纵截止输入到 script.py 文献,吩咐如次:
playwright codegen -o script.py -b firefox这功夫就弹出了一个 Firefox 欣赏器,同声右侧会输入一个剧本窗口,及时表露暂时操抵制应的代码。
咱们不妨在欣赏器中做任何操纵,比方翻开百度,而后点击输出框并输出 nba,而后再点击探求按钮,欣赏器窗口如次:
不妨瞥见欣赏器中还会高亮表露咱们正在操纵的页面节点,同声还表露了对应的采用器字符串 input[name=”wd”] ,右侧的窗口如图所示:
在操纵进程中,该窗口中的代码就及时变革,不妨看到这边天生了咱们一系列操纵的对应代码,比方在探求框中输出 nba,就对应如次代码:
page.fill("input***;name="wd"]", "nba")操纵结束之后,封闭欣赏器,Playwright 会天生一个 script.py 文献,实质如次:
from playwright.sync_api import sync_playwrightdef run(playwright): browser = playwright.firefox.launch(headless=False) context = browser.new_context() # Open new page page = context.new_page() # Go to https://www.baidu.com/ page.goto("https://www.baidu.com/") # Click input***;name="wd"] page.click("input***;name="wd"]") # Fill input***;name="wd"] page.fill("input***;name="wd"]", "nba") # Click text=百度一下 with page.expect_navigation(): page.click("text=百度一下") context.close() browser.close()with sync_playwright() as playwright: 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 其余一个特性功效即是不妨扶助挪动端欣赏器的模仿,比方模仿翻开 iPhone 12 Pro Max 上的 Safari 欣赏器,而后手动树立定位,并翻开百度舆图并截图。开始咱们不妨选定一个经纬度,比仍旧宫的经纬度是 39.***3904, 116.39014,咱们不妨经过 geolocation 参数传播给 Webkit 欣赏器并初始化。
示例代码如次:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: iphone_12_pro_max = p.devices***;'iPhone 12 Pro Max'] browser = p.webkit.launch(headless=False) context = browser.new_context( **iphone_12_pro_max, locale='zh-CN', geolocation={'longitude': 116.39014, 'latitude': 39.***3904}, 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 属性指定了一台挪动摆设,这边传入的是大哥大的型号,比方 iPhone 12 Pro Max,固然也不妨传其余称呼,比方 iPhone 8,Pixel 2 等。
前方咱们仍旧领会了 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= 发端的,发觉犹如没太有顺序的格式,它究竟扶助还好吗的配合准则呢?底下咱们来领会下。
传入的这个字符串,咱们不妨称之为 Element Selector,它不只仅扶助 CSS 采用器、XPath,Playwright 还扩充了少许简单好用的准则,比方径直按照文本实质挑选,按照节点层级构造挑选之类。
文本采用
文本采用扶助径直运用 text= 如许的语法举行挑选,示比方下:
page.click("text=Log in")这就代办采用文本是 Log in 的节点,并点击。
CSS 采用器
CSS 采用器之前也引见过了,比方按照 id 大概 class 挑选:
page.click("button")page.click("#nav-bar .contact-us-item")按照一定的节点属性挑选:
page.click("***;data-test=login-button]")page.click("***;aria-label='Sign in']")CSS 采用器 + 文本
咱们还不妨运用 CSS 采用器贯串文本值举行海选,比拟常用的即是 has-text 和 text,前者代办包括指定的字符串,后者代办字符串实足配合,示比方下:
page.click("article:has-text('Playwright')")page.click("#nav-bar :text('Contact us')")第一个即是采用文本中包括 Playwright 的 article 节点,第二个即是采用 id 为 nav-bar 节点华文本值即是 Contact us 的节点。
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 的十足消息,示比方下:
from playwright.sync_api import sync_playwrightdef 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://spa6.scrape.center/') page.wait_for_load_state('networkidle') browser.close()这边咱们在创造 Page 东西之后,就发端监听 response 事变,同声将回调本领树立为 on_response,on_response 东西接受一个参数,而后把 Response 的状况码和链接都输入出来了。
运转之后,不妨看到遏制台输入截止如次:
Statue 200: https://spa6.scrape.center/Statue 200: https://spa6.scrape.center/css/app.ea9d802a.cssStatue 200: https://spa6.scrape.center/js/app.5ef0d454.jsStatue 200: https://spa6.scrape.center/js/chunk-vendors.77daf9***.jsStatue 200: https://spa6.scrape.center/css/chunk-19c920f8.2a6496e0.css...Statue 200: https://spa6.scrape.center/css/chunk-19c920f8.2a6496e0.cssStatue 200: https://spa6.scrape.center/js/chunk-19c920f8.c3a1129d.jsStatue 200: https://spa6.scrape.center/img/logo.a508a8f0.pngStatue 200: https://spa6.scrape.center/fonts/element-icons.535877f5.woffStatue 301: https://spa6.scrape.center/api/movie?limit=10&offset=0&token=NGMwMzFhNGEzMTFiMzJkOGE0ZTQ1YjUzMTc2OWNiYTI1Yzk0ZDM3MSwxNjIyOTE4NTE5Statue 200: https://spa6.scrape.center/api/movie/?limit=10&offset=0&token=NGMwMzFhNGEzMTFiMzJkOGE0ZTQ1YjUzMTc2OWNiYTI1Yzk0ZDM3MSwxNjIyOTE4NTE5Statue 200: https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@464w_644h_1e_1cStatue 200: https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@464w_644h_1e_1c....Statue 200: https://p1.meituan.net/movie/b607fba7513e7f15eab170aac1e1400d878112.jpg@464w_644h_1e_1c“
提防:这边简略了局部反复的实质。
”
不妨看到,这边的输入截止本来凑巧对应欣赏器 Network 面板中一切的乞求和相应实质,和下图是逐一对应的:
这个网站咱们之前领会过,其如实的数据都是 Ajax 加载的,同声 Ajax 乞求中还带有加密参数,不好简单获得。
但有了这个本领,这边即使咱们想要截获 Ajax 乞求,岂不是就特殊简单了?
改写一下判决前提,输入对应的 JSON 截止,改写如次:
from playwright.sync_api import sync_playwrightdef on_response(response): if '/api/movie/' in response.url and response.status == 200: print(response.json())with sync_playwright() as p: 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': 'Farewell My Concubine', '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': 'The Lion King', '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 本领获得即可,用法如次:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: 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 参数指定对应节点的最长等候功夫。
示比方下:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: 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 本领,它不妨归来节点列表,经过遍历获得到单个节点之后,咱们不妨接着挪用单个节点的本领来举行少许操纵和属性获得,示比方下:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: 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') for element in elements: print(element.get_attribute('href')) print(element.text_content()) browser.close()这边咱们经过 query_selector_all 本领获得了一切配合到的节点,每个节点对应的是一个 ElementHandle 东西,而后 ElementHandle 东西也有 get_attribute 本领来获得节点属性,其余还不妨经过 text_content 本领获得节点文本。
运转截止如次:
/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx霸王别姬 - Farewell My Concubine/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIy这个杀手不太冷 - Léon/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIz肖申克的救赎 - The Shawshank Redemption/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI0泰坦尼克号 - Titanic/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI1罗马假期 - Roman Holiday/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI2唐伯虎点秋香 - Flirting Scholar/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI3浊世才子 - Gone with the Wind/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI4笑剧之王 - The King of Comedy/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWI5楚门的寰球 - The Truman Show/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIxMA==狮子王 - The Lion King获得单个节点
获得单个节点也有一定的本领,即是 query_selector,即使传入的采用器配合到多个节点,那它只会归来第一个节点,示比方下:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p: 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霸王别姬 - Farewell My Concubine不妨看到这边只输入了第一个配合节点的消息。
搜集威胁
结果再引见一个适用的本领 route,运用 route 本领,咱们不妨实行少许搜集威胁和窜改操纵,比方窜改 request 的属性,窜改 response 相应截止等。
看一个范例:
from playwright.sync_api import sync_playwrightimport rewith sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() def cancel_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 本领,废除了这次乞求,以是最?