
ໃນບໍລິສັດທີ່ຜ່ານມາຂອງຂ້ອຍ, ຂ້ອຍໄດ້ພັດທະນາວຽກ batch ທີ່ຕິດຕາມ metrics ໃນທົ່ວສື່ມວນຊົນສັງຄົມ, ເຊັ່ນ Twitter, LinkedIn, Mastodon, Bluesky, Reddit, ແລະອື່ນໆ. ຫຼັງຈາກນັ້ນຂ້ອຍຮູ້ວ່າຂ້ອຍສາມາດຊ້ໍາກັນສໍາລັບ "ບຸກຄົນ." ບັນຫາແມ່ນວ່າບາງສື່ບໍ່ສະຫນອງ HTTP API ສໍາລັບ metrics ທີ່ຂ້ອຍຕ້ອງການ. ນີ້ແມ່ນ ການວັດແທກ ທີ່ຂ້ອຍຕ້ອງການໃນ LinkedIn:
ຂ້ອຍຄົ້ນຫາເປັນເວລາດົນນານແຕ່ບໍ່ພົບການເຂົ້າເຖິງ API ສໍາລັບ metrics ຂ້າງເທິງ. ຂ້າພະເຈົ້າໄດ້ຂູດຕົວວັດແທກດ້ວຍຕົນເອງທຸກໆເຊົ້າເປັນເວລາດົນນານແລະສຸດທ້າຍໄດ້ຕັດສິນໃຈທີ່ຈະເຮັດວຽກທີ່ຫນ້າເບື່ອນີ້ໂດຍອັດຕະໂນມັດ. ນີ້ແມ່ນສິ່ງທີ່ຂ້ອຍໄດ້ຮຽນຮູ້.
ວຽກເຮັດງານທໍາຢູ່ໃນ Python, ສະນັ້ນຂ້າພະເຈົ້າຕ້ອງການທີ່ຈະຢູ່ໃນ stack ເຕັກໂນໂລຊີດຽວກັນ. ຫຼັງຈາກການຄົ້ນຄວ້າຢ່າງໄວວາ, ຂ້າພະເຈົ້າໄດ້ພົບເຫັນ Playwright , ເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບທີ່ມີ APIs ສອງພາສາ, ລວມທັງ Python. ກໍລະນີການນໍາໃຊ້ຫຼັກຂອງ Playwright ແມ່ນການທົດສອບໃນຕອນທ້າຍ, ແຕ່ມັນຍັງສາມາດຈັດການຕົວທ່ອງເວັບທີ່ຢູ່ນອກບໍລິບົດຂອງການທົດສອບ.
ຂ້ອຍກໍາລັງໃຊ້ Poetry ເພື່ອຈັດການການເພິ່ງພາອາໄສ. ການຕິດຕັ້ງ Playwright ແມ່ນງ່າຍດາຍເຊັ່ນ:
poetry add playwright
ໃນຈຸດນີ້, Playwright ແມ່ນພ້ອມທີ່ຈະໃຊ້. ມັນສະຫນອງສອງ APIs ທີ່ແຕກຕ່າງກັນ, ຫນຶ່ງ synchronous ແລະຫນຶ່ງ asynchronous . ເນື່ອງຈາກກໍລະນີທີ່ໃຊ້ຂອງຂ້ອຍ, ລົດຊາດທໍາອິດແມ່ນຫຼາຍກ່ວາພຽງພໍ.
ຂ້າພະເຈົ້າມັກການພັດທະນາເພີ່ມຂຶ້ນ.
ນີ້ແມ່ນບົດຄັດຫຍໍ້ຂອງ 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 ດ້ວຍຄວາມກະຕືລືລົ້ນ. ໃຫ້ສັງເກດວ່າທ່ານຄວນຕິດຕັ້ງຕົວທ່ອງເວັບສະເພາະກ່ອນຫນ້ານີ້, ie , playwright install --with-deps chromium
.
ໂດຍຄ່າເລີ່ມຕົ້ນ, ຕົວທ່ອງເວັບເປີດ headless ; ມັນບໍ່ປາກົດຂຶ້ນ. ຂ້າພະເຈົ້າແນະນໍາໃຫ້ແລ່ນມັນຢ່າງເຫັນໄດ້ໃນຕອນຕົ້ນສໍາລັບການແກ້ໄຂໄດ້ງ່າຍຂຶ້ນ: headless = True
.
ເປີດໜ້າຕ່າງບຣາວເຊີໃໝ່.
ນຳທາງໄປຫາສະຖານທີ່ໃໝ່.
ຊອກຫາຊ່ອງໃສ່ຂໍ້ມູນທີ່ລະບຸໄວ້ ແລະຕື່ມຂໍ້ມູນໃສ່ກັບຂໍ້ມູນປະຈໍາຕົວຂອງຂ້ອຍ.
ຊອກຫາປຸ່ມທີ່ລະບຸໄວ້ແລະກົດມັນ.
ຊອກຫາອົງປະກອບທີ່ລະບຸໄວ້ ທັງຫມົດ .
ເອົາຂໍ້ຄວາມພາຍໃນຂອງອົງປະກອບທໍາອິດ.
ປິດຕົວທ່ອງເວັບເພື່ອເຮັດຄວາມສະອາດ.
ຂ້າງເທິງນີ້ເຮັດວຽກຕາມທີ່ຄາດໄວ້. ຂໍ້ເສຍພຽງແຕ່ວ່າຂ້ອຍໄດ້ຮັບອີເມວຈາກ LinkedIn ທຸກໆຄັ້ງທີ່ຂ້ອຍແລ່ນສະຄິບ:
ສະບາຍດີ Nicolas,
ທ່ານໄດ້ເປີດນຳໃຊ້ຢ່າງສຳເລັດຜົນ ຈື່ຂ້ອຍຢູ່ໃນອຸປະກອນໃໝ່ HeadlessChrome, <OS> ໃນ <city>, <region>, <country> . ສຶກສາເພີ່ມເຕີມກ່ຽວກັບວິທີທີ່ຈື່ຂ້ອຍເຮັດວຽກຢູ່ໃນອຸປະກອນ.
ຂ້າພະເຈົ້າຍັງໄດ້ພົບກັບ Fabien Vauchelles ໃນກອງປະຊຸມ JavaCro . ລາວມີຄວາມຊ່ຽວຊານໃນການຂູດເວັບແລະບອກຂ້ອຍວ່າຄົນສ່ວນໃຫຍ່ໃນພາກສະຫນາມນີ້ໃຊ້ໂປໄຟຂອງຕົວທ່ອງເວັບ. ແທ້ຈິງແລ້ວ, ຖ້າທ່ານເຂົ້າສູ່ລະບົບ LinkedIn, ທ່ານຈະໄດ້ຮັບ token ການກວດສອບຄວາມຖືກຕ້ອງທີ່ເກັບໄວ້ເປັນ cookies, ແລະທ່ານຈະບໍ່ຈໍາເປັນຕ້ອງໄດ້ຢືນຢັນມັນອີກເທື່ອຫນຶ່ງກ່ອນທີ່ມັນຈະຫມົດອາຍຸ. ໂຊກດີ, 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()
Playwright ຈະເກັບໂປຣໄຟລ໌ໄວ້ໃນໂຟນເດີທີ່ລະບຸໄວ້ ແລະໃຊ້ມັນຄືນໃໝ່ໃນຮອບແລ່ນ.
ປັບປຸງການຈັດການຂໍ້ຍົກເວັ້ນ.
BrowserContext
ຍັງສາມາດເປີດຫນ້າເວັບຕ່າງໆໄດ້.
ພວກເຮົາພະຍາຍາມໄປຫາ dashboard. 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, ຂ້ອຍສາມາດບັນລຸສິ່ງທີ່ຂ້ອຍຕ້ອງການກັບ Playwright. ຂ້ອຍມັກໃຊ້ sync API ເພາະວ່າມັນເຮັດໃຫ້ລະຫັດງ່າຍຂຶ້ນເລັກນ້ອຍໃນການຫາເຫດຜົນ, ແລະຂ້ອຍບໍ່ມີຄວາມຕ້ອງການດ້ານການປະຕິບັດໃດໆ. ຂ້ອຍພຽງແຕ່ໃຊ້ຄຸນສົມບັດພື້ນຖານທີ່ສະເໜີໃຫ້ໂດຍ Playwright. Playwright ອະນຸຍາດໃຫ້ບັນທຶກວິດີໂອໃນສະພາບການຂອງການທົດສອບ, ເຊິ່ງເປັນປະໂຫຍດຫຼາຍໃນເວລາທີ່ການທົດສອບລົ້ມເຫລວໃນລະຫວ່າງການປະຕິບັດຂອງທໍ່ CI.
ໄປຕື່ມອີກ:
ຈັດພີມມາໃນເບື້ອງຕົ້ນກ່ຽວກັບ A Java Geek ໃນວັນທີ 19 ມັງກອນ 2024