„JavaScript“ ir skirtojo laiko klaidų šalinimas naudojant „Scrapy“ ir „Playwright“.
Vartojant Skrebučiai kartu su Skrepi dramaturgas, gali kilti problemų bandant nuskaityti puslapius, kuriems reikalingas JavaScript. Viena dažna problema yra pranešimas, kuriame prašoma įjungti JS ir išjungti bet kokį skelbimų blokatorių, kartu su skirtojo laiko klaida.
Ši problema paprastai kyla dėl to, kad vien tik „Scrapy“ nerodo „JavaScript“. Nors „Playwright“ yra integruota, kad tai tvarkytų, reikia atlikti papildomus veiksmus, kad jis būtų tinkamai sukonfigūruotas tokiose svetainėse kaip „ „Wall Street Journal“., kuris labai priklauso nuo JavaScript.
„Playwright“ integracija su „Scrapy“ siekiama įveikti tokius apribojimus, tačiau netinkami nustatymai arba nepastebimas naršyklės elgesys vis tiek gali sukelti varginančių klaidų. Tačiau naudodami tinkamas konfigūracijas ir derinimo strategijas galite apeiti šias kliūtis.
Šiame vadove aptarsime realų „Scrapy“ ir „Playwright“ nuskaitymo pavyzdį, įskaitant kodo sąranką ir derinimo patarimus, kad išvengtume įprastų spąstų, pvz., „JavaScript“ įkėlimo problemų ir skirtojo laiko klaidų.
komandą | Naudojimo pavyzdys |
---|---|
Puslapio metodas | Tai yra a Skrepi dramaturgas komanda, leidžianti vykdyti metodus „Playwright“ puslapio objekte, pvz., imituoti naršyklės veiksmus, pvz., spustelėjimą ar laukimą. Pavyzdžiui, PageMethod('wait_for_timeout', 5000) nurodo Playwright palaukti 5 sekundes prieš tęsiant. |
scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler | Tai yra tinkinta atsisiuntimų tvarkyklė, kurią teikia Skrepi dramaturgas valdyti HTTP užklausas, kurioms reikalingas „JavaScript“ atvaizdavimas. Jis integruoja „Playwright“ su „Scrapy“, todėl voras gali tvarkyti JS reikalaujantį turinį. |
Rinkiklis | A Skrebučiai įrankis duomenims iš HTML arba XML dokumentų išgauti naudojant XPath arba CSS selektorius. Šiame kontekste jis naudojamas HTML turiniui analizuoti po to, kai „Playwright“ pateikia puslapį. |
meta | The meta atributas „Scrapy“ užklausose leidžia užklausai perduoti papildomas parinktis ar nustatymus. Šiuo atveju meta={'playwright': True} leidžia „Playwright“ apdoroti užklausą, o ne numatytąją „Scrapy“ atsisiuntimo programą. |
PLAYWRIGHT_BROWSER_TYPE | Šis nustatymas nurodo naršyklės tipą, kurį turėtų naudoti dramaturgas. Parinktys apima chromo, firefox, ir žiniatinklio rinkinys. Čia naudojome „chromą“, kad būtų suderinamas su daugeliu svetainių. |
PLAYWRIGHT_LAUNCH_OPTIONS | „Playwright“ naršyklės egzemplioriaus konfigūracijos parinktys, pvz., režimo be galvos įjungimas arba išjungimas ir naršyklės paleidimo nuostatų nustatymas. Pavyzdžiui, be galvos: „False“ paleidžia naršyklę su vartotojo sąsaja, kad būtų lengviau derinti. |
TWISTED_REACTOR | Scrapy naudoja Susuktas tinklo biblioteka, skirta asinchroniniam I/O tvarkymui. TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor' įgalina Scrapy dirbti su Playwright, kuris remiasi asyncio. |
PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT | Šis nustatymas koreguoja numatytąjį „Playwright“ naršymo skirtąjį laiką. Padidinus skirtojo laiko reikšmę, pvz., 60 000 ms, tai užtikrina, kad „Playwright“ turėtų pakankamai laiko įkelti ir pateikti sudėtingus tinklalapius prieš pasibaigiant laikui. |
laukti_skirto laiko | Dramaturgui būdingas metodas, naudojamas pristabdyti vykdymą tam tikram laikui. Scenarijuje „wait_for_timeout“ naudojama norint atidėti procesą 5 sekundėms, paliekant pakankamai laiko puslapio „JavaScript“ įkelti ir vykdyti. |
Išsamus Scrapy ir dramaturgo integravimo paaiškinimas
Pateiktuose scenarijuose integruojama Skrebučiai su Dramaturgas yra labai svarbus tvarkant svetaines, kuriose yra daug „JavaScript“, pvz., WSJ. Paprastai „Scrapy“ savaime netvarko „JavaScript“ vykdymo. Dėl to kyla problemų nuskaitant dinaminį turinį, nes puslapis gali būti neįkeltas iki galo, todėl atsiranda klaida „Įgalinkite JS ir išjunkite bet kokią skelbimų blokavimo priemonę“. Naudodami „Playwright“ kaip atsisiuntimo tvarkyklę, „Scrapy“ įkelia puslapius taip, kaip tai darytų visas funkcijas palaikanti naršyklė, pateikdama „JavaScript“ ir kitą dinaminį turinį.
Šiai integracijai būtini tinkinti nustatymai, apibrėžti vore. Nurodome, kad „Scrapy“ turėtų naudoti „Playwright“ tvarkyklę tiek HTTP, tiek HTTPS užklausoms. Be to, nustatant PLAYWRIGHT_BROWSER_TYPE į „chromą“ padeda užtikrinti suderinamumą su dauguma svetainių. Spider taip pat sukonfigūruotas taip, kad naršyklė būtų paleista be galvos režimu, o tai reiškia, kad naršyklė turės matomą vartotojo sąsają, kuri gali būti naudinga derinant sudėtingas svetaines. Šios konfigūracijos leidžia „Playwright“ imituoti žmogaus sąveiką su svetaine, apeinant pagrindinius blokus, tokius kaip klaida „Įgalinkite JS“.
Taikant start_requests metodą, kiekviena užklausa sukonfigūruojama naudoti „Playwright“ perduodant meta={'dramaturgas': tiesa}. Taip užtikrinama, kad užklausą tvarkys „Playwright“, o ne „Scrapy“ numatytoji parsisiuntimo programa. Naudojimas Puslapio metodas yra labai svarbus imituojant tikras naršymo sąlygas. Linija PageMethod('laukti_laiko_laukimo', 5000) nurodo „Playwright“ palaukti 5 sekundes, suteikiant puslapiui pakankamai laiko įkelti visą dinaminį „JavaScript“ turinį. Tai ypač naudinga nuskaitant svetaines, kurių pilnai įkėlimas užtrunka, taip išvengiama skirtojo laiko ir klaidų.
Analizavimo metodas yra vieta, kur vyksta tikrasis grandymas. Kai „Playwright“ pateikia puslapį, „Scrapy“ perima ir analizuoja HTML turinį naudodama Rinkiklis objektas. Tai leidžia tiksliai išgauti reikiamus duomenis naudojant XPath arba CSS selektorius. „Playwright“ integravimas užtikrina, kad analizuojamame HTML yra visas „JavaScript“ pateiktas turinys, todėl jis yra daug tikslesnis ir patikimesnis dinamiškiems tinklalapiams. Scenarijus išveda patvirtinimo pranešimą („Veikia“), nurodantį sėkmingą išgryninimą, tačiau realiame scenarijuje duomenis ištrauktumėte ir saugotumėte čia.
Scrapy ir dramaturgas: patikimas sprendimas svetainėms, kuriose yra daug JavaScript
Šis sprendimas parodo, kaip naudoti Python's Scrapy su Playwright, norint įkelti daug JavaScript turinčius puslapius, pvz., WSJ, tvarkyti įprastas klaidas, pvz., „Įgalinkite JS“ ir skirtąjį laiką.
import scrapy
from scrapy_playwright.page import PageMethod
from scrapy.selector import Selector
class WsjNewsJSSpider(scrapy.Spider):
name = 'wsj_newsJS'
start_urls = ['https://www.wsj.com']
custom_settings = {
"DOWNLOAD_HANDLERS": {
'http': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
'https': 'scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler',
},
"TWISTED_REACTOR": 'twisted.internet.asyncioreactor.AsyncioSelectorReactor',
"PLAYWRIGHT_BROWSER_TYPE": "chromium",
"PLAYWRIGHT_LAUNCH_OPTIONS": {"headless": False},
}
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
meta={
'playwright': True,
'playwright_page_methods': [
PageMethod('wait_for_timeout', 5000),
],
},
callback=self.parse
)
def parse(self, response):
html_content = response.text
sel = Selector(text=html_content)
print("JavaScript page rendered successfully!")
Alternatyvus sprendimas: naršyklės be galvos naudojimas ir skirtojo laiko nustatymų reguliavimas
Šis sprendimas apima naršyklės nustatymų ir skirtojo laiko reguliavimą, kad būtų galima iškrapštyti sudėtingus puslapius, naudojant režimą be galvos, kad išteklių naudojimas būtų efektyvesnis.
import scrapy
from scrapy_playwright.page import PageMethod
class HeadlessSpider(scrapy.Spider):
name = 'headless_spider'
start_urls = ['https://www.wsj.com']
custom_settings = {
"PLAYWRIGHT_BROWSER_TYPE": "chromium",
"PLAYWRIGHT_LAUNCH_OPTIONS": {"headless": True, "timeout": 30000},
"PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT": 60000, # Increase timeout
}
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
meta={
'playwright': True,
'playwright_page_methods': [
PageMethod('wait_for_timeout', 3000), # Wait for 3 seconds
],
},
callback=self.parse
)
def parse(self, response):
print("Page scraped successfully!")
html = response.text
# Further parsing of the page goes here
Žiniatinklio iškarpymo tobulinimas naudojant dramaturgą: „JavaScript“ turinčios svetainės
Naudojant Skrepi išgryninimui dažnai iškyla „JavaScript“ turinčių svetainių iššūkis. Svetaines, kurioms reikalingas „JavaScript“ dinaminiam turiniui, pvz., naujienų straipsniams ar akcijų kainoms, pateikti, sunkiau nuskaityti naudojant vien „Scrapy“. Štai kur yra integracija Skrepi dramaturgas tampa lemtinga. Dramaturgas veikia kaip naršyklės variklis, pateikdamas puslapius kaip ir žmogus, todėl galima nuskaityti turinį, kuris priklauso nuo kliento pusės JavaScript vykdymo.
Dramaturgas padeda apeiti įprastas kliūtis, pvz., skirtąjį laiką ir klaidas, kai prašoma įjungti „JavaScript“ arba išjungti skelbimų blokatorius. Scenarijaus pavyzdyje „Playwright“ sukonfigūruotas laukti prieš pateikdamas turinį, kad įsitikintų, jog „JavaScript“ elementai yra visiškai įkelti. Ši technika žymiai pagerina duomenų išgavimą iš svetainių, kurios kitu atveju blokuotų arba apribotų prieigą naudojant robotų aptikimą arba dinaminį turinį.
Vienas papildomas aspektas, kurį verta apsvarstyti, yra galimybė tvarkyti kelių puslapių svetaines. Dramaturgas ne tik įkelia „JavaScript“ elementus, bet ir palaiko vartotojui būdingas sąveikas, pvz., mygtukų paspaudimą arba kelių puslapių naršymą. Tai ypač naudinga svetainėms, kuriose turinys yra padalintas į kelias dalis arba paslėptas už paspaudimo ir įkėlimo mechanizmų, todėl galite lanksčiau rinkti struktūrinius ir vertingus duomenis.
Dažniausiai užduodami klausimai apie „JavaScript“ sunkių svetainių iškrapštymą naudojant „Scrapy“ ir „Playwright“.
- Kaip „Playwright“ padeda svetainėms, kuriose yra daug „JavaScript“?
- Dramaturgas imituoja tikrą naršyklę, leisdamas jai įkelti ir vykdyti „JavaScript“ prieš perduodant puslapį atgal Scrapy už grandymą.
- Kodėl gaunu pranešimą „Įgalinkite JS“?
- Ši klaida įvyksta, nes „Scrapy“ pati negali pateikti „JavaScript“. Sprendimas yra integruotis Playwright tvarkyti JavaScript pagrįstą turinį.
- Ar galiu naudoti „Playwright“ su kitomis naršyklėmis?
- Taip, „Playwright“ palaiko kelias naršykles, pvz chromium, firefox, ir webkit, kurį galima nurodyti nustatymuose.
- Kaip išvengti „Playwright“ skirtojo laiko?
- Galite reguliuoti skirtąjį laiką naudodami PageMethod('wait_for_timeout', 5000) kad būtų daugiau laiko pilnai įkelti JavaScript turiniui.
- Ar galiu nubraukti kelis puslapius naudojant „Playwright“?
- Taip, „Playwright“ leidžia vartotojui panašią sąveiką, pvz., spustelėti kelis puslapius arba mygtukus, kad būtų galima nubraukti puslapius arba paslėptą turinį.
Baigimas: „JavaScript“ problemų įveikimas žiniatinklyje
„Scrapy“ sujungimas su „Playwright“ išsprendžia daugybę iššūkių, su kuriais susiduriama renkant dinamišką turinį svetainėse. Imituodamas naršyklės elgesį, „Playwright“ užtikrina, kad „JavaScript“ turinys būtų visiškai pateiktas prieš ištraukimą.
Norint pagerinti našumą, labai svarbu įdiegti tokius metodus kaip skirtojo laiko nustatymų koregavimas ir naršyklės tipų nustatymas. Tiksliai sureguliavę šias parinktis, „Scrapy“ naudotojai gali išgryninti sudėtingesnes svetaines nepatirdami įprastų klaidų, pvz., „JavaScript“ skirtojo laiko.
„JavaScript Web Scraping Solutions“ šaltiniai ir nuorodos
- Šį straipsnį įkvėpė praktiniai „Scrapy“ integravimo su „Playwright“ pavyzdžiai, norint išgauti dinamišką turinį iš svetainių, kuriose daug „JavaScript“. Išsamią dokumentaciją apie dramaturgo naudojimą rasite čia: Dramaturgo Python dokumentacija .
- Norėdami gauti daugiau įžvalgų apie „JavaScript“ atvaizdavimo ir nuskaitymo metodus naudojant „Scrapy“, apsilankykite: Scrapy oficialūs dokumentai .
- Norėdami geriau suprasti asinchroninio programavimo sudėtingumą su „Twisted Reactor“, naudojamu kartu su „Playwright in Scrapy“, žr. Susukto reaktoriaus dokumentacija .