❗ Disclaimer : Ito ang Part 3 ng aming anim na piraso na serye sa Advanced Web Scraping. Bago sa serye? Magsimula sa simula sa pamamagitan ng pagbabasa ng Part 1 !
Sa Bahagi 2 ng aming serye ng Advanced na Web Scraping, natutunan mo kung paano mag-scrape ng data mula sa mga SPA, PWA, at mga site na pinapagana ng AI . Sa ngayon, dapat ay mayroon ka na ng lahat ng kaalamang kailangan para makabuo ng scraper na gumagana laban sa karamihan sa mga modernong website.
Ano ang susunod? Oras na para i-optimize ang iyong scraper gamit ang ilang mga propesyonal na tip at trick sa pag-scrape!
Bumuo ng web scraper? Ito ay tungkol sa scripting . 👨💻
At maging tapat tayo—kung nagsulat ka na ng code, alam mong hindi ganoon kahirap ang pag-script sa karamihan ng oras. Ilang linya dito, for
doon, at boom, nag-i-scrap ka ng data tulad ng isang pro. Mukhang simple, tama? 😄
Ngunit narito ang problema: ang pagiging simple ng pagsusulat ng isang maliit na scraper ay maaaring huminahon sa iyo sa isang maling pakiramdam ng seguridad. Bakit mag-abala sa tamang mga komento, paghawak ng error, mga log, o kahit na maayos na indentation kung ito ay isang dosenang linya ng code na mababasa ng sinuman?
Naiintindihan namin—bakit mag-overengineer ng isang bagay na hindi naman kailangan nito? Ang overengineering ay ang kaaway ng pag-unlad. Ngunit ano ang mangyayari kapag kailangan mong i-scale ang iyong mga scraper sa maraming page o kahit sa buong site? 🤔
Iyan ay kapag ang iyong mabilis-at-marumi, spaghetti-coded scraper ay bumagsak! 🍝
Narito kung bakit kailangan mo ng ilang advanced na tip sa web scraping.
Maaaring narinig mo na ang karaniwang mga tip sa pag-scrape ng web: unahin ang mga page na may kritikal na data, i-randomize ang iyong mga kahilingan, at iba pa. Mahusay na payo—ngunit maging tapat tayo, ang mga trick na iyon ay lumang balita. 📰
Kapag nakikitungo ka sa mas advanced na mga sitwasyon, maaaring hindi ito maputol ng mga pangunahing kaalaman. Kung talagang gusto mong i-level up ang iyong laro sa pag-scrape, kakailanganin mong tuklasin ang ilang mga diskarte sa susunod na antas.
handa na? Mag-buckle up—oras na para dalhin ang iyong mga kasanayan sa pag-scrape sa web sa susunod na antas! 💪
⚠️ Babala: Huwag mag-alala kung pamilyar ang ilan sa mga tip—magpatuloy! Maraming kawili-wiling insight habang sumisid ka nang mas malalim! 🤿
Ang isa sa mga pinakakaraniwang pagkakamali sa web scraping ay ang pagkalimot na ang Internet ay hindi isang mahiwagang, hindi nagkakamali na teknolohiya. Kapag nagpadala ka ng kahilingan sa isang site, ang isang buong hanay ng mga bagay ay maaaring (at, sa isang punto) magkamali. ❌
Tingnan natin ang ilang karaniwang mga sitwasyon:
Ang iyong Wi-Fi o koneksyon ay maaaring masinok sandali
Maaaring hindi available ang server na nagho-host sa website
Maaaring wala na ang page na hinahanap mo
Ang target na site ay maaaring nakakaranas ng pansamantalang paghina, na humahantong sa isang error sa pag-timeout
Ngayon, paghaluin ang pag-parse ng data, preprocessing, at pag-export sa isang database, at mayroon kang perpektong recipe para sa kaguluhan. 💥
Kaya, ano ang solusyon? Error sa paghawak ! 🛡️
Ang paghawak ng error ay ang iyong matalik na kaibigan sa web scraping. Ang iyong script ay malamang na magpoproseso ng dose-dosenang (o libu-libo) ng mga pahina, at ang isang error ay hindi dapat magpabagsak sa iyong buong operasyon.
Tandaan na ang try ... catch
block ay iyong kaibigan. Gamitin ito upang ibalot ang iyong mga kahilingan at lohika sa pagproseso. Gayundin, tandaan na ang karamihan sa mga library ng HTTP ay hindi nagtataas ng mga pagbubukod para sa masasamang tugon sa HTTP (tulad ng 404
o 500
). 😲
Kung hindi ka pamilyar sa mga HTTP status code , tingnan ang video sa ibaba:
Halimbawa, sa library ng mga kahilingan ng Python kailangan mong manu-manong suriin ang code ng status ng tugon tulad ng sumusunod:
import requests response = requests.get("https://example.com") if response.status_code == 200: # handle the successful response... else: # handle the error response...
O, katumbas nito, gamitin ang raise_for_status() na paraan:
import requests try: response = requests.get("https://example.com") # raises an HTTPError for bad responses (4xx or 5xx) response.raise_for_status() # handle the successful response... except requests.exceptions.HTTPError as http_err: # handle an HTTP error... except requests.exceptions.RequestException as req_err: # handle a request error...
Ang iyong advanced na web scraping script ay hindi lamang dapat makayanan ang mga error ngunit makabawi din mula sa mga ito. Dahil ang karamihan sa mga error na nauugnay sa pag-scrape ng web ay nauugnay sa paggawa ng mga kahilingan sa web, maaari mong makabuluhang mapabuti ang pagiging epektibo ng iyong scraper sa pamamagitan ng pagpapatupad ng mga kahilingang maaaring muling subukan .
Simple lang ang konsepto: kung nabigo ang isang kahilingan, susubukan mo itong muli—isa, dalawa, tatlo, o higit pang beses—hanggang sa maging matagumpay ito. 🔄
Ngunit narito ang catch: dahil ang isa sa mga pinaka-karaniwang dahilan para sa isang nabigong kahilingan ay ang target na server na pansamantalang down o mabagal, hindi mo nais na lampasan ito sa pamamagitan ng paulit-ulit na pagpapadala ng parehong kahilingan sa maikling panahon.
Kung nabigo ang isang kahilingan ngayon, malamang na mabigo muli ito kaagad. Doon papasok ang exponential backoff !
Sa halip na subukang muli kaagad, unti-unting pinapataas ng diskarteng ito ang oras sa pagitan ng mga muling pagsubok, na pinapabuti ang iyong mga pagkakataong magtagumpay sa pamamagitan ng pagbibigay ng oras sa target na server upang mabawi. ⏳
Bagama't maaari mong manual na ipatupad ang mga simpleng diskarte sa muling pagsubok gamit ang custom na code, maraming kliyente ng HTTP ang may kasamang mga built-in na utility o library upang awtomatikong mahawakan ang mga muling pagsubok. Halimbawa, nag-aalok ang Axios ng axios-retry library, na maaari mong gamitin tulad nito:
const axios = require("axios"); const axiosRetry = require("axios-retry"); axiosRetry(axios, { retries: 3, retryDelay: axiosRetry.exponentialDelay }); axios.get('https://example.com') .then(response => console.log(response.data)) .catch(error => console.log("Request failed:", error));
Katulad nito, ang urllib3
package ng Python ay may kasamang Retry class na walang putol na pinagsama sa karamihan ng Python HTTP client .
Kapag nag-iinspeksyon sa mga elemento sa DevTools, maaaring matukso kang mag-right click at piliin ang opsyong "Kopyahin ang tagapili":
Ngunit maging babala, ang resulta ay maaaring magmukhang ganito:
#__next > div > main > div.sc-d7dc08c8-0.fGqCtJ > div.sc-93e186d7-0.eROqxA > h1
Iyan ay tiyak na hindi perpekto para sa web scraping….
Ang problema? Ang mga sobrang partikular na tagapili na tulad nito ay madaling masira kapag nagbago ang istraktura ng page. Kapag mas detalyado ang iyong tagapili, mas nagiging marupok ito.
Upang gawing mas nababanat ang iyong web scraping, dapat mong panatilihing flexible ang iyong mga tagapili. Sa halip na umasa sa mga klaseng nauugnay sa istilo (na nagbabago sa lahat ng oras), tumuon sa mga attribute na mas malamang na magbago, tulad ng id
, data-
, o aria-
. Karamihan sa mga katangiang iyon ay para sa pagsubok at pagiging naa-access , kaya malamang na manatiling pare-pareho ang mga ito sa paglipas ng panahon. 💡
At habang ang mga tagapili ng CSS ay mas madaling basahin at maunawaan, ang XPath ay nag-aalok ng higit na kapangyarihan. Ngunit huwag mag-alala—madalas mong makakamit ang parehong mga resulta gamit ang mga simpleng CSS selector, na nagliligtas sa iyo mula sa pangangailangan ng kumplikadong XPath code. 😌
Para sa higit pang impormasyon tungkol doon, tingnan ang aming gabay sa XPath vs CSS selectors !
Ang pag-parse ng mga pahina ng HTML ay nangangailangan ng oras at mapagkukunan, lalo na kung nakikipag-usap ka sa isang malaking, nested na DOM. Kung ang iyong scraper ay nag-parse lamang ng ilang mga pahina, hindi ito isang malaking bagay.
Ngayon, ano ang mangyayari kapag lumaki ang iyong operasyon sa pag-scrape at kailangan mong kunin ang data mula sa milyun-milyong page? Ang maliit na overhead na iyon ay maaaring mabilis na maubos ang mga mapagkukunan ng server at magdagdag ng mga oras sa iyong kabuuang oras ng pag-scrape. ⏳
Upang makakuha ng mas malalim na pag-unawa, sumangguni sa mga mapagkukunang ito:
Naghahanap ng buong paghahambing? Basahin ang aming artikulo sa pinakamahusay na mga parser ng HTML .
Ang magandang balita? Ang paglipat mula sa isang parser patungo sa isa pa ay hindi ganoon kahirap. Halimbawa, sa BeautifulSoup , isa lang itong simpleng pagbabago ng parameter:
from bs4 import BeautifulSoup # or using html.parser soup = BeautifulSoup(html_content, "html.parser") # or using lxml parser soup = BeautifulSoup(html_content, "lxml")
At paano naman ang mga HTML parser na naka-built in sa mga browser tulad ng Chrome? 🤔
Alamin ang higit pa sa video sa ibaba:
Ang HTTP/2 ay isang na-update na bersyon ng HTTP na nagbibigay-daan sa maraming kahilingan sa isang koneksyon. Binabawasan nito ang latency at maaaring mapabuti ang pangkalahatang pagganap ng iyong gawain sa pag-scrape.
Upang tingnan kung sinusuportahan ng isang site ang HTTP/2, buksan lang ang DevTools sa iyong browser, pumunta sa tab na “Network,” at hanapin ang column na “Protocol”—kung may nakasulat na h2
, gumagamit ang site ng HTTP/2:
Sa kasamaang palad, hindi lahat ng HTTP client at scraping library ay sumusuporta sa HTTP/2. Gayunpaman, ang mga tool tulad ng HTTPX para sa Python ay nag-aalok ng buong suporta para sa HTTP/2 .
Ang pag-scrape sa web ay kadalasang isang gawain na nakatali sa I/O —nagpapadala ka ng mga kahilingan sa server, maghintay para sa tugon, iproseso ang data, at uulitin. Sa panahon ng paghihintay, ang iyong scraper ay karaniwang walang ginagawa, na hindi epektibo.
Ang solusyon? Paralelismo o pagkakatugma !
Sa pamamagitan ng pagpapadala ng maraming kahilingan nang sabay-sabay, maaari mong bawasan ang mga patay na oras na iyon at i-optimize ang paggamit ng network.
🚨 Ngunit mag-ingat! 🚨
Ang pagbomba sa isang server na may napakaraming sabay-sabay na kahilingan ay maaaring humantong sa paglilimita sa rate o pagbabawal ng iyong IP—dalawang sikat na anti-scraping measures . 😬
Pro tip : Maaari mo ring iparallelize ang mga gawain sa pag-parse, lalo na kung gumagamit ka ng maraming CPU, na magpapabilis sa proseso ng pagkuha ng data. ⚡
Ang mga adaptive algorithm na nakabatay sa AI ay natututo mula sa mga pattern sa data at mga istruktura ng HTML na pahina, na inaayos ang kanilang gawi sa real-time upang manatiling nakakaalam ng mga pagbabago. 😮
Iyan ay isang game-changer para sa web scraping! 🤯
Kapag na-update ng mga website ang kanilang layout o nag-deploy ng mga anti-bot na hakbang, mabilis na makakaangkop ang mga algorithm na ito, na tinitiyak na patuloy na tumatakbo nang maayos ang iyong scraper. 🧠
Sa madaling salita, ginagawa nilang mas matalino ang mga scraper, na tumutulong sa iyong kumuha ng data nang mahusay—kahit na ang site ay naghagis ng mga hindi inaasahang curveball. ⚾ Gamit ang mga adaptive algorithm, para itong magkaroon ng scraper na nagbabago sa paglipas ng panahon!
Matuto pa sa Kabanata 4 ng video na ito ni Forrest Knight:
Sigurado, lahat ng tip at trick na nabanggit namin sa ngayon ay maaaring gawing mas mabilis, mas maaasahan, matatag, at epektibo ang iyong scraper. Ngunit maging totoo tayo—nagdudulot din sila ng maraming kumplikado. 😅
Ang magandang balita ay ang karamihan sa mga araling ito ay nalalapat sa karamihan ng mga proyekto sa pag-scrape. Kaya, sa halip na i-coding ang lahat mula sa simula, maaari mong gamitin ang mga pre-built na function upang harapin ang mga partikular na gawain. Iyan mismo ang inaalok ng Bright Data's Scraping Functions !
Sa 73+ na mga yari na JavaScript function, ang mga user ay nakabuo ng mahigit 38K scraper na tumatakbo sa 195+ na bansa. Iyan ay isang tonelada ng scraping power! 📈
Pabilisin ang iyong pag-unlad gamit ang isang runtime na kapaligiran na idinisenyo upang i-scrape, i-unlock, at sukatin ang pangongolekta ng data sa web nang walang kahirap-hirap:
Ngayon alam mo na kung paano i-level up ang iyong scraper gamit ang mga insight mula sa mga may karanasang nag-scrape na developer!
Tandaan na Part 3 pa lang ito, kaya nasa kalagitnaan pa lang tayo ng anim na bahaging paglalakbay tungo sa advanced web scraping! Panatilihing nakatali ang seatbelt na iyon dahil malapit na tayong sumisid sa mas makabagong teknolohiya, matatalinong solusyon, at mga tip sa tagaloob.
Next stop? Ginagamit ang kapangyarihan ng pamamahala ng proxy na hinimok ng AI! 🌐