Developer Advocate, eternal learner, author
Дар ширкати қаблии худ, ман як кори дастаҷамъие таҳия кардам, ки ченакҳоро дар шабакаҳои иҷтимоӣ, аз қабили 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
Объекти playwright
гиред.
Як мисоли браузерро оғоз кунед. Намудҳои зиёди браузерҳо мавҷуданд; Ман Chromium-ро бо хоҳиши худ интихоб кардам. Дар хотир доред, ки шумо бояд қаблан браузери мушаххасро насб карда будед, яъне playwright install --with-deps chromium
.
Бо нобаёнӣ, браузер бе сар мекушояд; зоҳир намешавад. Ман маслиҳат медиҳам, ки онро дар аввал ба таври намоён иҷро кунед, то ислоҳи осонтар: headless = True
.
Равзанаи нави браузер кушоед.
Ба макони нав гузаред.
Майдонҳои вурудии муайяншударо ҷойгир кунед ва онҳоро бо маълумоти ман пур кунед.
Тугмаи муайяншударо ҷойгир кунед ва онро пахш кунед.
Ҳама унсурҳои муайяншударо ҷойгир кунед.
Матни дохилии элементи якумро гиред.
Барои тоза кардани браузер браузерро пӯшед.
Корҳои дар боло зикршуда тавре кор карданд. Ягона нуқсон ин аст, ки ман ҳар дафъае, ки скриптро иҷро мекардам, аз 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()
Драматург профилро дар папкаи муайяншуда нигоҳ медорад ва онро дар тамоми даврон дубора истифода мебарад.
Муносибати истисноро такмил диҳед.
BrowserContext
инчунин метавонад саҳифаҳоро кушояд.
Мо кӯшиш мекунем, ки ба панели идоракунӣ гузаред. LinkedIn моро ба саҳифаи воридшавӣ равона мекунад, агар мо тасдиқ нашавем; пас мо метавонем тасдиқ кунем.
Новобаста аз натиҷа, контекстро пӯшед.
Дар ин лаҳза, ба мо лозим аст, ки бори аввал бо ҳарду маълумоти эътимоднома тасдиқ кунем. Дар марҳилаҳои минбаъда, он вобаста аст.
Ман ҳайрон шудам, ки рамзи боло боэътимод кор намекунад. Он дар давраи аввал ва баъзан дар марҳилаҳои минбаъда кор мекард. Азбаски ман профили браузерро дар саросари иҷро нигоҳ медорам, вақте ки ман бояд аутентификатсия кунам, 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 нашр шудааст