Savā iepriekšējā uzņēmumā es izstrādāju pakešu darbu, kas izsekoja metriku sociālajos saziņas līdzekļos, piemēram, Twitter, LinkedIn, Mastodon, Bluesky, Reddit utt. Tad es sapratu, ka varu to dublēt savai "personai". Problēma ir tāda, ka daži datu nesēji nenodrošina HTTP API manām vēlamajām metrikām. Šeit ir metrika, ko es vēlos LinkedIn:
Es meklēju ilgu laiku, bet neatradu API piekļuvi iepriekš minētajiem rādītājiem. Es ilgu laiku katru rītu manuāli skrāpēju rādītājus un beidzot nolēmu automatizēt šo nogurdinošo uzdevumu. Lūk, ko es uzzināju.
Darbs ir Python, tāpēc es vēlos palikt tajā pašā tehnoloģiju kaudzē. Pēc ātras izpētes es atradu Playwright — pārlūkprogrammas automatizācijas rīku ar pāris valodu API, tostarp Python. Dramaturga galvenais lietošanas gadījums ir pilnīga pārbaude, taču tas var pārvaldīt pārlūkprogrammu arī ārpus testēšanas konteksta.
Es izmantoju dzeju, lai pārvaldītu atkarības. Playwright instalēšana ir tikpat vienkārša kā:
poetry add playwright
Šajā brīdī Playwright ir gatavs lietošanai. Tas piedāvā divas atšķirīgas API — vienu sinhrono un vienu asinhrono . Mana lietošanas gadījuma dēļ pirmā garša ir vairāk nekā pietiekama.
Man patīk pakāpeniski tuvoties attīstībai.
Šeit ir API izvilkums:
Tas tiek tulkots šādā kodā:
from playwright.sync_api import Browser, Locator, Page, sync_playwright with (sync_playwright() as pw): #1 browser: Browser = pw.chromium.launch() #2 page: Page = browser.new_page() #3 page.goto('https://www.linkedin.com/login') #4 page.locator('#username').press_sequentially(getenv('LINKEDIN_USERNAME')) #5 page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD')) #5 page.locator('button[type=submit]').press('Enter') #6 page.goto('https://www.linkedin.com/dashboard/') #4 metrics_container: Locator = page.locator('.pcd-analytic-view-items-container') metrics: List[Locator] = metrics_container.locator('p.text-body-large-bold').all() #7 impressions = atoi(metrics[0].inner_text()) #8 # Get other metrics browser.close() #9
Iegūstiet playwright
objektu.
Palaidiet pārlūkprogrammas gadījumu. Ir pieejami vairāki pārlūkprogrammu veidi; Es izvēlējos Chromium pēc iegribas. Ņemiet vērā, ka jums iepriekš bija jāinstalē konkrēta pārlūkprogramma, ti , playwright install --with-deps chromium
.
Pēc noklusējuma pārlūkprogramma tiek atvērta bez galvas ; tas neparādās. Es ieteiktu to palaist redzami sākumā, lai atvieglotu atkļūdošanu: headless = True
.
Atveriet jaunu pārlūkprogrammas logu.
Dodieties uz jaunu atrašanās vietu.
Atrodiet norādītos ievades laukus un aizpildiet tos ar maniem akreditācijas datiem.
Atrodiet norādīto pogu un nospiediet to.
Atrodiet visus norādītos elementus.
Iegūstiet pirmā elementa iekšējo tekstu.
Lai notīrītu, aizveriet pārlūkprogrammu.
Iepriekš minētais strādāja, kā paredzēts. Vienīgais mīnuss ir tas, ka es saņēmu e-pastu no LinkedIn katru reizi, kad palaist skriptu:
Sveiks Nikolā,
Jūs esat veiksmīgi aktivizējis Atcerēties mani jaunā ierīcē HeadlessChrome, <OS> <city>, <region>, <country> . Uzziniet vairāk par to, kā Atcerēties mani darbojas ierīcē.
Es arī satiku Fabienu Vauchelles JavaCro konferencē. Viņš specializējas tīmekļa skrāpēšanā un man teica, ka lielākā daļa cilvēku šajā jomā izmanto pārlūkprogrammas profilus. Patiešām, ja piesakāties LinkedIn, jūs saņemsit autentifikācijas pilnvaru, kas tiek saglabāta kā sīkfaili, un jums tas nebūs vēlreiz jāautentificē pirms tā derīguma termiņa beigām. Par laimi, Playwright piedāvā šādu funkciju ar savu launch_persistent_context
metodi.
Mēs varam aizstāt iepriekš minēto launch
ar šādu:
with sync_playwright() as pw: playwright_profile_dir = f'{Path.home()}/.social-metrics/playwright-profile' context: BrowserContext = pw.chromium.launch_persistent_context(playwright_profile_dir) #1 try: #2 page: Page = context.new_page() #3 page.goto('https://www.linkedin.com/dashboard/') #4 if 'session_redirect' in page.url: #4 page.locator('#username').press_sequentially(getenv('LINKEDIN_USERNAME')) page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD')) page.locator('button[type=submit]').press('Enter') page.goto('https://www.linkedin.com/dashboard/') metrics_container: Locator = page.locator('.pcd-analytic-view-items-container') # Same as in the previous snippet except Exception as e: #2 logger.error(f'Could not fetch metrics: {e}') finally: #5 context.close()
Dramaturgs saglabās profilu norādītajā mapē un izmantos to atkārtoti.
Uzlabojiet izņēmumu apstrādi.
BrowserContext
var arī atvērt lapas.
Mēs cenšamies pāriet uz informācijas paneli. LinkedIn novirzīs mūs uz pieteikšanās lapu, ja mēs neesam autentificēti; tad mēs varam autentificēties.
Aizveriet kontekstu neatkarīgi no rezultāta.
Šobrīd mums tikai pirmo reizi ir jāveic autentifikācija ar abiem akreditācijas datiem. Turpmākajos braucienos tas ir atkarīgs.
Es biju pārsteigts, redzot, ka iepriekš minētais kods nedarbojās droši. Tas darbojās pirmajā piegājienā un dažreiz arī nākamajos. Tā kā es glabāju pārlūkprogrammas profilu vairākās darbībās, tad, kad man ir nepieciešams autentificēties, LinkedIn prasa tikai paroli, nevis pieteikšanos! Tā kā kods mēģina ievadīt pieteikšanos, šajā gadījumā tas neizdodas. Labojums ir diezgan vienkāršs:
username_field = page.locator('#username') if username_field.is_visible(): username_field.press_sequentially(getenv('LINKEDIN_USERNAME')) page.locator('#password').press_sequentially(getenv('LINKEDIN_PASSWORD'))
Lai gan es neesmu Python eksperts, man izdevās sasniegt to, ko gribēju, izmantojot Dramaturgu. Es izvēlējos izmantot sinhronizācijas API, jo tas nedaudz atvieglo koda pamatojumu, un man nav nekādu veiktspējas prasību. Es izmantoju tikai Playwright piedāvātās pamatfunkcijas. Dramaturgs ļauj ierakstīt video testu kontekstā, kas ir ļoti noderīgi, ja tests neizdodas CI konveijera izpildes laikā.
Lai dotos tālāk:
Sākotnēji publicēts vietnē A Java Geek 2024. gada 19. janvārī