paint-brush
Драматург: Қадамҳои аввалини ман бо абзори автоматикунонии браузераз ҷониби@nfrankel
494 хониш
494 хониш

Драматург: Қадамҳои аввалини ман бо абзори автоматикунонии браузер

аз ҷониби Nicolas Fränkel7m2025/01/26
Read on Terminal Reader

Хеле дароз; Хондан

Баъзе васоити ахбори омма HTTP API-ро барои ченакҳое, ки ман мехоҳам, таъмин намекунанд. Playwright як воситаи автоматикунонии браузер бо якчанд API-ҳои забонӣ, аз ҷумла Python мебошад. Он ду API-и гуногунро пешниҳод мекунад, яке синхронӣ ва дигаре асинхронӣ.
featured image - Драматург: Қадамҳои аввалини ман бо абзори автоматикунонии браузер
Nicolas Fränkel HackerNoon profile picture

Дар ширкати қаблии худ, ман як кори дастаҷамъие таҳия кардам, ки ченакҳоро дар шабакаҳои иҷтимоӣ, аз қабили Twitter, LinkedIn, Mastodon, Bluesky, Reddit ва ғайра пайгирӣ мекард. Сипас ман фаҳмидам, ки метавонам онро барои "шахси" худам такрор кунам. Мушкилот дар он аст, ки баъзе васоити ахбори омма HTTP API-ро барои ченакҳое, ки ман мехоҳам, таъмин намекунанд. Инҳо ченакҳое ҳастанд, ки ман дар LinkedIn мехоҳам:


Панели ченакҳои LinkedIn


Ман муддати тӯлонӣ ҷустуҷӯ кардам, аммо дастрасии API-ро барои ченакҳои дар боло зикршуда наёфтам. Ман ҳар саҳар муддати тӯлонӣ метрикаҳоро дастӣ мебурдам ва ниҳоят тасмим гирифтам, ки ин вазифаи дилгиркунандаро автоматӣ кунам. Ин аст он чизе ки ман омӯхтам.

Контекст

Кор дар Python аст, бинобар ин ман мехоҳам дар ҳамон стек технологӣ бимонам. Пас аз як таҳқиқоти зуд, ман Playwright , як абзори автоматикунонии браузерро бо якчанд API-ҳои забонӣ, аз ҷумла Python пайдо кардам. Ҳолати асосии истифодаи драматург ин санҷиши ниҳоӣ мебошад, аммо он инчунин метавонад браузерро берун аз контексти санҷиш идора кунад.


Ман Poetry-ро барои идора кардани вобастагӣ истифода мебарам. Насб кардани Playwright чунон осон аст:


 poetry add playwright


Дар айни замон, драматург барои истифода омода аст. Он ду API-и гуногунро пешниҳод мекунад, яке синхронӣ ва дигаре асинхронӣ . Аз сабаби истифодаи ман, маззаи аввал беш аз кофӣ аст.

Пойхоямро тар кардан

Ман мехоҳам, ки тадриҷан ба рушд наздик шавам.


Ин аст иқтибос аз API:


Иқтибос аз модели API


Он ба рамзи зерин тарҷума мешавад:


 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
  1. Объекти playwright гиред.


  2. Як мисоли браузерро оғоз кунед. Намудҳои зиёди браузерҳо мавҷуданд; Ман Chromium-ро бо хоҳиши худ интихоб кардам. Дар хотир доред, ки шумо бояд қаблан браузери мушаххасро насб карда будед, яъне playwright install --with-deps chromium .


    Бо нобаёнӣ, браузер бе сар мекушояд; зоҳир намешавад. Ман маслиҳат медиҳам, ки онро дар аввал ба таври намоён иҷро кунед, то ислоҳи осонтар: headless = True .


  3. Равзанаи нави браузер кушоед.


  4. Ба макони нав гузаред.


  5. Майдонҳои вурудии муайяншударо ҷойгир кунед ва онҳоро бо маълумоти ман пур кунед.


  6. Тугмаи муайяншударо ҷойгир кунед ва онро пахш кунед.


  7. Ҳама унсурҳои муайяншударо ҷойгир кунед.


  8. Матни дохилии элементи якумро гиред.


  9. Барои тоза кардани браузер браузерро пӯшед.

Нигоҳ доштани кукиҳо

Корҳои дар боло зикршуда тавре кор карданд. Ягона нуқсон ин аст, ки ман ҳар дафъае, ки скриптро иҷро мекардам, аз LinkedIn паёми электронӣ гирифтам:


Салом Николас,


Шумо бомуваффақият фаъол кардаед Маро дар як дастгоҳи нави HeadlessChrome, <OS> дар <шаҳр>, <минтақа>, <кишвар> ёд кунед. Муфассалтар дар бораи чӣ гуна кор кардани маро дар ёд доред дар дастгоҳ.


Ман инчунин бо Фабиен Вочелес дар конфронси JavaCro вохӯрдам. Вай дар скрепинги веб тахассус дорад ва ба ман гуфт, ки аксари одамон дар ин соҳа профилҳои браузерро истифода мебаранд. Дарвоқеъ, агар шумо ба LinkedIn ворид шавед, шумо аломати аутентификатсияро ҳамчун кукиҳо нигоҳ медоред ва ба шумо лозим нест, ки онро пеш аз ба охир расидани мӯҳлати он дубора тасдиқ кунед. Хушбахтона, Playwright чунин хусусиятро бо усули launch_persistent_context худ пешниҳод мекунад.


Мо метавонем launch болоро бо зерин иваз кунем:


 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()
  1. Драматург профилро дар папкаи муайяншуда нигоҳ медорад ва онро дар тамоми даврон дубора истифода мебарад.


  2. Муносибати истисноро такмил диҳед.


  3. BrowserContext инчунин метавонад саҳифаҳоро кушояд.


  4. Мо кӯшиш мекунем, ки ба панели идоракунӣ гузаред. LinkedIn моро ба саҳифаи воридшавӣ равона мекунад, агар мо тасдиқ нашавем; пас мо метавонем тасдиқ кунем.


  5. Новобаста аз натиҷа, контекстро пӯшед.


Дар ин лаҳза, ба мо лозим аст, ки бори аввал бо ҳарду маълумоти эътимоднома тасдиқ кунем. Дар марҳилаҳои минбаъда, он вобаста аст.

Мутобиқшавӣ ба воқеият

Ман ҳайрон шудам, ки рамзи боло боэътимод кор намекунад. Он дар давраи аввал ва баъзан дар марҳилаҳои минбаъда кор мекард. Азбаски ман профили браузерро дар саросари иҷро нигоҳ медорам, вақте ки ман бояд аутентификатсия кунам, LinkedIn танҳо паролро мепурсад, на воридшавӣ! Азбаски код кӯшиш мекунад, ки логинро ворид кунад, он дар ин ҳолат ноком мешавад. Ислоҳ хеле осон аст:


 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'))

Хулоса

Гарчанде ки ман коршиноси Python нестам, ман тавонистам он чизеро, ки мехостам бо Драматург ба даст орам. Ман истифодаи API-и синхронизатсияро афзалтар донистам, зеро он рамзро каме осонтар мекунад, ки дар бораи он фикр кунам ва ман ягон талаботи иҷроиш надорам. Ман танҳо хусусиятҳои асосии пешниҳодкардаи драматург истифода кардам. Драматург имкон медиҳад, ки видеоҳоро дар заминаи санҷишҳо сабт кунад, ки ин ҳангоми нокомии санҷиш ҳангоми иҷрои лӯлаи CI хеле муфид аст.


Барои минбаъд рафтан:



Бори аввал дар A Java Geek 19 январи соли 2024 нашр шудааст