paint-brush
ຜູ້ຂຽນບົດລະຄອນ: ຂັ້ນຕອນທໍາອິດຂອງຂ້ອຍກັບເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບໂດຍ@nfrankel
471 ການອ່ານ
471 ການອ່ານ

ຜູ້ຂຽນບົດລະຄອນ: ຂັ້ນຕອນທໍາອິດຂອງຂ້ອຍກັບເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບ

ໂດຍ Nicolas Fränkel7m2025/01/26
Read on Terminal Reader

ຍາວເກີນໄປ; ອ່ານ

ບາງສື່ບໍ່ໃຫ້ HTTP API ສໍາລັບການວັດແທກທີ່ຂ້ອຍຕ້ອງການ. Playwright ເປັນເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບທີ່ມີ APIs ສອງພາສາ, ລວມທັງ Python. ມັນສະຫນອງສອງ APIs ທີ່ແຕກຕ່າງກັນ, ຫນຶ່ງ synchronous ແລະຫນຶ່ງ asynchronous.
featured image - ຜູ້ຂຽນບົດລະຄອນ: ຂັ້ນຕອນທໍາອິດຂອງຂ້ອຍກັບເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບ
Nicolas Fränkel HackerNoon profile picture

ໃນບໍລິສັດທີ່ຜ່ານມາຂອງຂ້ອຍ, ຂ້ອຍໄດ້ພັດທະນາວຽກ batch ທີ່ຕິດຕາມ metrics ໃນທົ່ວສື່ມວນຊົນສັງຄົມ, ເຊັ່ນ Twitter, LinkedIn, Mastodon, Bluesky, Reddit, ແລະອື່ນໆ. ຫຼັງຈາກນັ້ນຂ້ອຍຮູ້ວ່າຂ້ອຍສາມາດຊ້ໍາກັນສໍາລັບ "ບຸກຄົນ." ບັນຫາແມ່ນວ່າບາງສື່ບໍ່ສະຫນອງ HTTP API ສໍາລັບ metrics ທີ່ຂ້ອຍຕ້ອງການ. ນີ້ແມ່ນ ການວັດແທກ ທີ່ຂ້ອຍຕ້ອງການໃນ LinkedIn:


ກະດານວັດແທກ LinkedIn


ຂ້ອຍຄົ້ນຫາເປັນເວລາດົນນານແຕ່ບໍ່ພົບການເຂົ້າເຖິງ API ສໍາລັບ metrics ຂ້າງເທິງ. ຂ້າພະເຈົ້າໄດ້ຂູດຕົວວັດແທກດ້ວຍຕົນເອງທຸກໆເຊົ້າເປັນເວລາດົນນານແລະສຸດທ້າຍໄດ້ຕັດສິນໃຈທີ່ຈະເຮັດວຽກທີ່ຫນ້າເບື່ອນີ້ໂດຍອັດຕະໂນມັດ. ນີ້ແມ່ນສິ່ງທີ່ຂ້ອຍໄດ້ຮຽນຮູ້.

ສະພາບການ

ວຽກເຮັດງານທໍາຢູ່ໃນ Python, ສະນັ້ນຂ້າພະເຈົ້າຕ້ອງການທີ່ຈະຢູ່ໃນ stack ເຕັກໂນໂລຊີດຽວກັນ. ຫຼັງຈາກການຄົ້ນຄວ້າຢ່າງໄວວາ, ຂ້າພະເຈົ້າໄດ້ພົບເຫັນ Playwright , ເຄື່ອງມືອັດຕະໂນມັດຂອງຕົວທ່ອງເວັບທີ່ມີ APIs ສອງພາສາ, ລວມທັງ Python. ກໍລະນີການນໍາໃຊ້ຫຼັກຂອງ Playwright ແມ່ນການທົດສອບໃນຕອນທ້າຍ, ແຕ່ມັນຍັງສາມາດຈັດການຕົວທ່ອງເວັບທີ່ຢູ່ນອກບໍລິບົດຂອງການທົດສອບ.


ຂ້ອຍກໍາລັງໃຊ້ Poetry ເພື່ອຈັດການການເພິ່ງພາອາໄສ. ການ​ຕິດ​ຕັ້ງ Playwright ແມ່ນ​ງ່າຍ​ດາຍ​ເຊັ່ນ​:


 poetry add playwright


ໃນຈຸດນີ້, Playwright ແມ່ນພ້ອມທີ່ຈະໃຊ້. ມັນສະຫນອງສອງ APIs ທີ່ແຕກຕ່າງກັນ, ຫນຶ່ງ synchronous ແລະຫນຶ່ງ asynchronous . ເນື່ອງຈາກກໍລະນີທີ່ໃຊ້ຂອງຂ້ອຍ, ລົດຊາດທໍາອິດແມ່ນຫຼາຍກ່ວາພຽງພໍ.

ຕີນຂອງຂ້ອຍປຽກ

ຂ້າ​ພະ​ເຈົ້າ​ມັກ​ການ​ພັດ​ທະ​ນາ​ເພີ່ມ​ຂຶ້ນ​.


ນີ້ແມ່ນບົດຄັດຫຍໍ້ຂອງ 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 ດ້ວຍຄວາມກະຕືລືລົ້ນ. ໃຫ້ສັງເກດວ່າທ່ານຄວນຕິດຕັ້ງຕົວທ່ອງເວັບສະເພາະກ່ອນຫນ້ານີ້, ie , playwright install --with-deps chromium .


    ໂດຍຄ່າເລີ່ມຕົ້ນ, ຕົວທ່ອງເວັບເປີດ headless ; ມັນບໍ່ປາກົດຂຶ້ນ. ຂ້າ​ພະ​ເຈົ້າ​ແນະ​ນໍາ​ໃຫ້​ແລ່ນ​ມັນ​ຢ່າງ​ເຫັນ​ໄດ້​ໃນ​ຕອນ​ຕົ້ນ​ສໍາ​ລັບ​ການ​ແກ້​ໄຂ​ໄດ້​ງ່າຍ​ຂຶ້ນ​: headless = True .


  3. ເປີດໜ້າຕ່າງບຣາວເຊີໃໝ່.


  4. ນຳທາງໄປຫາສະຖານທີ່ໃໝ່.


  5. ຊອກຫາຊ່ອງໃສ່ຂໍ້ມູນທີ່ລະບຸໄວ້ ແລະຕື່ມຂໍ້ມູນໃສ່ກັບຂໍ້ມູນປະຈໍາຕົວຂອງຂ້ອຍ.


  6. ຊອກຫາປຸ່ມທີ່ລະບຸໄວ້ແລະກົດມັນ.


  7. ຊອກຫາອົງປະກອບທີ່ລະບຸໄວ້ ທັງຫມົດ .


  8. ເອົາຂໍ້ຄວາມພາຍໃນຂອງອົງປະກອບທໍາອິດ.


  9. ປິດຕົວທ່ອງເວັບເພື່ອເຮັດຄວາມສະອາດ.

ການເກັບຮັກສາ Cookies

ຂ້າງເທິງນີ້ເຮັດວຽກຕາມທີ່ຄາດໄວ້. ຂໍ້ເສຍພຽງແຕ່ວ່າຂ້ອຍໄດ້ຮັບອີເມວຈາກ 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()
  1. Playwright ຈະເກັບໂປຣໄຟລ໌ໄວ້ໃນໂຟນເດີທີ່ລະບຸໄວ້ ແລະໃຊ້ມັນຄືນໃໝ່ໃນຮອບແລ່ນ.


  2. ປັບປຸງການຈັດການຂໍ້ຍົກເວັ້ນ.


  3. BrowserContext ຍັງສາມາດເປີດຫນ້າເວັບຕ່າງໆໄດ້.


  4. ພວກເຮົາພະຍາຍາມໄປຫາ dashboard. 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, ຂ້ອຍສາມາດບັນລຸສິ່ງທີ່ຂ້ອຍຕ້ອງການກັບ Playwright. ຂ້ອຍມັກໃຊ້ sync API ເພາະວ່າມັນເຮັດໃຫ້ລະຫັດງ່າຍຂຶ້ນເລັກນ້ອຍໃນການຫາເຫດຜົນ, ແລະຂ້ອຍບໍ່ມີຄວາມຕ້ອງການດ້ານການປະຕິບັດໃດໆ. ຂ້ອຍພຽງແຕ່ໃຊ້ຄຸນສົມບັດພື້ນຖານທີ່ສະເໜີໃຫ້ໂດຍ Playwright. Playwright ອະນຸຍາດໃຫ້ບັນທຶກວິດີໂອໃນສະພາບການຂອງການທົດສອບ, ເຊິ່ງເປັນປະໂຫຍດຫຼາຍໃນເວລາທີ່ການທົດສອບລົ້ມເຫລວໃນລະຫວ່າງການປະຕິບັດຂອງທໍ່ CI.


ໄປຕື່ມອີກ:



ຈັດພີມມາໃນເບື້ອງຕົ້ນກ່ຽວກັບ A Java Geek ໃນວັນທີ 19 ມັງກອນ 2024