Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Statik vs dinamik sahifa
- 2.2. Selenium/Playwright nima
- 2.3. Brauzerni boshqarish
- 2.4. Elementlarni topish va bosish
- 2.5. Kutish (wait)
- 2.6. Headless rejim
- 2.7. Selenium vs Playwright
- 2.8. Dinamik scraping — narx va tanlov
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Statik vs dinamik (mock)
- Misol 2 — Brauzer amallari (mock)
- Misol 3 — Kutish va elementlar (mock)
- Misol 4 — Amaliy: dinamik scraping oqimi (mock)
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
26.5-dars: Scraping — Selenium / Playwright
26-QISM — AVTOMATLASHTIRISH · 5-dars
1. Kirish va motivatsiya
26.3–26.4 da requests + BeautifulSoup bilan scraping qildik — lekin ular statik HTML uchun (server tayyor HTML yuboradi). Zamonaviy saytlar ko'pincha dinamik: JavaScript sahifani brauzerda quradi (ma'lumot keyin yuklanadi — cheksiz aylantirish, tugma bosish, forma to'ldirish). requests faqat boshlang'ich HTML'ni ko'radi (JS ishlab chiqargan kontent yo'q). Bunday sahifalar uchun real brauzer kerak.
Selenium / Playwright — brauzerni avtomatlashtiruvchi vositalar (real brauzer boshqaradi): sahifani ochish, tugma bosish, forma to'ldirish, aylantirish, JS ishlagach kontentni olish. Selenium (eski, keng tarqalgan), Playwright (yangi, tez, ishonchli — Microsoft). Ular brauzerni (Chrome, Firefox) kod bilan boshqaradi — inson qiladigan amallarni avtomatik. Bu dinamik sahifa scraping, veb test (avtomatik sinash), avtomatlashtirish (forma to'ldirish) uchun. Real brauzer — sekinroq, lekin JS kontentni ko'radi.
Real vaziyat. Bir narx kuzatish skripti ishlamay qoldi — sayt yangi dizaynda narxni JavaScript bilan yuklardi (requests bo'sh ko'radi). Playwright'ga o'tdi: real brauzer sahifani ochdi, JS ishladi, narx paydo bo'ldi, oldi. Dinamik sayt ham scraping qilindi. Selenium/Playwright — JS sahifalar uchun. requests ko'rmaganini brauzer ko'radi.
Bu darsda Selenium/Playwright bilan dinamik scraping'ni o'rganamiz.
Bu darsda:
- Statik vs dinamik sahifa
- Selenium/Playwright nima
- Brauzerni boshqarish
- Elementlarni topish va bosish
- Kutish (wait)
- Headless rejim
- Selenium vs Playwright
- Amaliy: dinamik scraping (mock)
ℹ Misollarda deterministik mock brauzer (soxta — real brauzer va tarmoq talab qiladi) bilan sinaladi. Namunalar API naqshini ko'rsatadi.
2. Nazariya — chuqur tushuntirish
2.1. Statik vs dinamik sahifa
Ikki xil veb sahifa:
Statik: server tayyor HTML yuboradi (requests ko'radi)
→ requests + BeautifulSoup yetarli
Dinamik: JS sahifani brauzerda quradi (requests ko'rmaydi)
→ real brauzer kerak (Selenium/Playwright) Statik sahifa — server tayyor HTML yuboradi (ma'lumot HTML'da — requests ko'radi). Dinamik sahifa — server bo'sh (yoki qisman) HTML yuboradi, JavaScript brauzerda ma'lumotni yuklaydi va sahifani quradi (requests ko'rmaydi — faqat boshlang'ich HTML). Belgi: requests bo'sh/qisman ko'radi, lekin brauzerda ma'lumot bor. Zamonaviy saytlar (React, Vue) ko'pincha dinamik. Dinamik uchun real brauzer (Selenium/Playwright). Farqni bilish — to'g'ri vosita.
2.2. Selenium/Playwright nima
Real brauzerni kod bilan:
# Playwright misol:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
kontent = page.content() # JS ishlagach HTML
browser.close() Selenium/Playwright — real brauzerni (Chrome, Firefox) kod bilan boshqaradi: brauzer ochish (launch), sahifaga o'tish (goto), JS ishlashini kutish, kontentni olish (content). Ular inson qiladigan amallarni (bosish, yozish, aylantirish) avtomatlashtiradi. requestsdan farq: real brauzer (JS ishlaydi, sekinroq). Playwright (zamonaviy — tez, ishonchli), Selenium (eski, keng). Dinamik sahifa, veb test uchun. Brauzer avtomatlashtirish.
2.3. Brauzerni boshqarish
Asosiy amallar:
page.goto(url) # sahifaga o'tish
page.click("button.next") # tugma bosish
page.fill("input#qidiruv", "python") # forma to'ldirish
page.content() # HTML (JS ishlagach)
page.screenshot(path="s.png") # skrinshot Brauzerni boshqarish — inson amallarini kod bilan: goto(url) (sahifaga), click(selektor) (tugma/havola bosish), fill(selektor, matn) (forma to'ldirish), content() (HTML olish — BeautifulSoup bilan tahlil), screenshot() (rasm). Selektorlar — CSS 26.4-bob yoki teg. Bu foydalanuvchi qiladigan har amalni avtomatlashtiradi (kirish, qidirish, aylantirish). Real brauzer — real o'zaro ta'sir.
2.4. Elementlarni topish va bosish
Sahifa elementlari:
page.locator("button.next").click() # topib bosish
page.locator(".narx").text_content() # matn olish
page.locator(".mahsulot").all() # barcha element
element.is_visible() # ko'rinadimi Elementlarni topish (locator — Playwright): page.locator(selektor) (CSS bilan topish — 26.4), .click() (bosish), .text_content() (matn), .all() (barcha), .is_visible() (ko'rinadimi). Selenium'da find_element(By.CSS_SELECTOR, ...). Bu dinamik sahifada ma'lumot olish va o'zaro ta'sir (bosish, keyingi sahifa). BeautifulSoup (statik tahlil) o'rniga brauzer (dinamik — bosish, kutish). Element — sahifa qismi.
2.5. Kutish (wait)
JS yuklanishini kutish:
page.wait_for_selector(".narx") # element paydo bo'lguncha kut
page.wait_for_load_state("networkidle") # tarmoq tinchlanguncha
# Selenium: WebDriverWait Kutish (wait) — muhim dinamik sahifada: JS ma'lumotni keyinroq yuklaydi — darrov olsangiz, hali yo'q (None). wait_for_selector(".narx") (element paydo bo'lguncha kut), wait_for_load_state (yuklanish tugaguncha). Playwright ko'p amalda avtomatik kutadi (aqlli), Selenium'da aniq kutish kerak. Kutmasdan — noto'g'ri natija (element hali yo'q). "Sabr — dinamik scraping kaliti". Vaqt bergach element paydo bo'ladi.
2.6. Headless rejim
Ekransiz brauzer:
browser = p.chromium.launch(headless=True) # ekransiz (server)
browser = p.chromium.launch(headless=False) # ko'rinadigan (debug) Headless rejim — brauzer ekransiz ishlaydi (headless=True): server/skript uchun (ekran yo'q, tez), ko'rinmaydi. headless=False — brauzer ko'rinadi (debug — nima bo'layaptini ko'rish). Ishlab chiqarishda headless (tez, resurs kam), sinashda ko'rinadigan (nosozlik). Selenium/Playwright ikkalasi ham. Headless — avtomatik ishlashda standart (odam ko'rmaydi — 26.1 skript kabi). Ekransiz — samarali.
2.7. Selenium vs Playwright
| Xususiyat | Selenium | Playwright |
|---|---|---|
| Yosh | Eski (2004) | Yangi (2020) |
| Tezlik | Sekinroq | Tezroq |
| Kutish | Qo'lda | Avtomatik (aqlli) |
| Sozlash | Murakkabroq | Oson |
| Keng tarqalish | Juda keng | O'smoqda |
Selenium (2004 — eski, juda keng tarqalgan, ko'p resurs) vs Playwright (2020 — yangi, tez, ishonchli, avtomatik kutish — Microsoft). Playwright afzalliklari: avtomatik kutish (kam xato), tezroq, oson sozlash, zamonaviy. Selenium — eski loyihalar, keng hujjatlar. Yangi loyihada Playwright tavsiya. Ikkalasi ham brauzer avtomatlashtiradi (o'xshash g'oya). Tanlov: yangi → Playwright, mavjud Selenium → davom. Zamonaviy tanlov — Playwright.
2.8. Dinamik scraping — narx va tanlov
Dinamik scraping (Selenium/Playwright) kuchli, lekin qimmatroq: sekinroq (real brauzer — sahifa yuklash, JS ishlash), ko'p resurs (brauzer xotira), murakkabroq (kutish, o'zaro ta'sir). Qoida: avval requests (statik — tez), kerak bo'lsa brauzer (dinamik — JS kontent). Ko'p sayt aslida statik yoki API bor 26.3-bob — brauzer keraksiz. "To'g'ri vosita": statik → requests, dinamik → Playwright, API → requests (afzal). Brauzer — oxirgi chora (eng qimmat, lekin eng kuchli). Vositani sahifaga qarab tanla.
3. Tez ma'lumotnoma
# Playwright (zamonaviy):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
# amallar:
page.click("button.next") # bosish
page.fill("input#q", "python") # forma
page.wait_for_selector(".narx") # kutish
narx = page.locator(".narx").text_content()
kontent = page.content() # HTML (BeautifulSoup bilan)
browser.close()
# Selenium (eski):
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get(url); driver.find_element(...).click()
# tanlov:
# statik → requests · dinamik → Playwright · API → requests (afzal)Selenium/Playwright xulosasi
Statik (requests) vs dinamik (JS — brauzer kerak) · goto/click/fill
locator (element) · wait (JS yuklanishi) · headless (ekransiz)
Playwright (yangi, tez) vs Selenium (eski) · brauzer — oxirgi chora (qimmat)4. Batafsil misollar
Misollarda deterministik mock brauzer (soxta — real brauzer va tarmoq talab qiladi) bilan sinaladi. Namunalar Selenium/Playwright naqshini ko'rsatadi.
Misol 1 — Statik vs dinamik (mock)
"""statik (requests ko'radi) vs dinamik (JS — brauzer kerak) — farqni ko'rsatish."""
import warnings
warnings.filterwarnings("ignore")
def requests_get(html_turi: str) -> str:
"""Soxta requests — faqat boshlang'ich HTML."""
if html_turi == "statik":
return "<div class='narx'>100</div>" # ma'lumot bor
return "<div id='app'></div>" # bo'sh (JS to'ldiradi)
def brauzer_get(html_turi: str) -> str:
"""Soxta brauzer — JS ishlagach HTML."""
if html_turi == "statik":
return "<div class='narx'>100</div>"
return "<div id='app'><div class='narx'>100</div></div>" # JS to'ldirdi
def main() -> None:
print("=== 1. Statik sahifa (requests yetarli) ===")
print(f" requests: {requests_get('statik')}")
print(f" narx ko'rinadi: {'narx' in requests_get('statik')}")
print("\n=== 2. Dinamik sahifa (requests bo'sh) ===")
print(f" requests: {requests_get('dinamik')}")
print(f" narx ko'rinadi: {'narx' in requests_get('dinamik')}")
print("\n=== 3. Dinamik — brauzer kerak ===")
print(f" brauzer: {brauzer_get('dinamik')}")
print(f" narx ko'rinadi: {'narx' in brauzer_get('dinamik')}")
print("\n=== 4. Tanlov ===")
print(" statik → requests (tez)")
print(" dinamik → brauzer (Selenium/Playwright)")
print(" ⭐ statik vs dinamik — to'g'ri vosita tanlash")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Statik sahifa (requests yetarli) ===
requests: <div class='narx'>100</div>
narx ko'rinadi: True
=== 2. Dinamik sahifa (requests bo'sh) ===
requests: <div id='app'></div>
narx ko'rinadi: False
=== 3. Dinamik — brauzer kerak ===
brauzer: <div id='app'><div class='narx'>100</div></div>
narx ko'rinadi: True
=== 4. Tanlov ===
statik → requests (tez)
dinamik → brauzer (Selenium/Playwright)
⭐ statik vs dinamik — to'g'ri vosita tanlashNima ko'rsatdi: 2.1-bo'lim.
Misol 2 — Brauzer amallari (mock)
"""mock brauzer: goto/click/fill/content — brauzerni boshqarish naqshi."""
import warnings
warnings.filterwarnings("ignore")
class MockPage:
"""Soxta Playwright page (deterministik)."""
def __init__(self) -> None:
self.url = None
self.harakatlar: list = []
def goto(self, url: str) -> None:
self.url = url
self.harakatlar.append(f"goto: {url}")
def click(self, selektor: str) -> None:
self.harakatlar.append(f"click: {selektor}")
def fill(self, selektor: str, matn: str) -> None:
self.harakatlar.append(f"fill: {selektor}={matn}")
def content(self) -> str:
return "<div class='natija'>Qidiruv natijasi</div>"
def main() -> None:
page = MockPage()
print("=== 1. Sahifaga o'tish (goto) ===")
page.goto("https://example.com/search")
print(f" URL: {page.url}")
print("\n=== 2. Forma to'ldirish (fill) ===")
page.fill("input#qidiruv", "python kursi")
print(f" harakatlar: {page.harakatlar[-1]}")
print("\n=== 3. Tugma bosish (click) ===")
page.click("button.qidir")
print(f" harakatlar: {page.harakatlar[-1]}")
print("\n=== 4. Kontent olish (content) ===")
html = page.content()
print(f" HTML: {html}")
print(f" barcha amallar: {len(page.harakatlar)}")
print(" ⭐ brauzer amallari — goto/fill/click/content")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Sahifaga o'tish (goto) ===
URL: https://example.com/search
=== 2. Forma to'ldirish (fill) ===
harakatlar: fill: input#qidiruv=python kursi
=== 3. Tugma bosish (click) ===
harakatlar: click: button.qidir
=== 4. Kontent olish (content) ===
HTML: <div class='natija'>Qidiruv natijasi</div>
barcha amallar: 3
⭐ brauzer amallari — goto/fill/click/contentNima ko'rsatdi: 2.2, 2.3-bo'limlar.
Misol 3 — Kutish va elementlar (mock)
"""kutish (wait — JS yuklanishi); elementlarni topish (locator) — dinamik naqsh."""
import warnings
warnings.filterwarnings("ignore")
class MockPage:
"""JS yuklanishini simulyatsiya qiluvchi soxta page."""
def __init__(self) -> None:
self.js_yuklandi = False
def goto(self, url: str) -> None:
self.js_yuklandi = False # boshda JS yo'q
def wait_for_selector(self, selektor: str) -> bool:
self.js_yuklandi = True # kutgach JS yuklandi
return True
def get_narx(self) -> str:
return "100" if self.js_yuklandi else None
def main() -> None:
page = MockPage()
page.goto("https://example.com")
print("=== 1. Kutmasdan (JS hali yo'q) ===")
print(f" narx (kutmasdan): {page.get_narx()}")
print("\n=== 2. Kutish (wait_for_selector) ===")
page.wait_for_selector(".narx")
print(f" JS yuklandi: {page.js_yuklandi}")
print("\n=== 3. Kutgach (narx paydo bo'ldi) ===")
print(f" narx (kutgach): {page.get_narx()}")
print("\n=== 4. Nega kutish muhim ===")
print(" JS ma'lumotni keyinroq yuklaydi")
print(" kutmasdan — None (element hali yo'q)")
print(" ⭐ wait — dinamik sahifa scraping kaliti")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Kutmasdan (JS hali yo'q) ===
narx (kutmasdan): None
=== 2. Kutish (wait_for_selector) ===
JS yuklandi: True
=== 3. Kutgach (narx paydo bo'ldi) ===
narx (kutgach): 100
=== 4. Nega kutish muhim ===
JS ma'lumotni keyinroq yuklaydi
kutmasdan — None (element hali yo'q)
⭐ wait — dinamik sahifa scraping kalitiNima ko'rsatdi: 2.4, 2.5-bo'limlar.
Misol 4 — Amaliy: dinamik scraping oqimi (mock)
Real dinamik scraping: brauzer och → sahifaga o't → kut → BeautifulSoup bilan tahlil. Bu — Selenium/Playwright oqimining namunasi (mock bilan).
"""to'liq dinamik scraping (mock): brauzer → goto → wait → content → BeautifulSoup tahlil."""
import warnings
warnings.filterwarnings("ignore")
from bs4 import BeautifulSoup
class MockBrowser:
"""Soxta brauzer (JS ishlagach HTML qaytaradi)."""
def scrape(self, url: str) -> str:
# JS ishlagach to'liq HTML (real brauzer buni beradi)
return """
<div class="mahsulot"><span class="nom">Python</span><span class="narx">100</span></div>
<div class="mahsulot"><span class="nom">Go</span><span class="narx">120</span></div>
"""
def main() -> None:
print("=== 1. Brauzer bilan sahifa olish (headless) ===")
browser = MockBrowser()
html = browser.scrape("https://example.com/dinamik")
print(" brauzer JS ishladi, HTML olindi")
print("\n=== 2. BeautifulSoup bilan tahlil 26.4-bob ===")
soup = BeautifulSoup(html, "html.parser")
mahsulotlar = soup.find_all("div", class_="mahsulot")
print(f" mahsulotlar soni: {len(mahsulotlar)}")
print("\n=== 3. Ma'lumot ajratish ===")
for div in mahsulotlar:
nom = div.find("span", class_="nom").text
narx = div.find("span", class_="narx").text
print(f" {nom}: {narx}")
print("\n=== 4. Oqim ===")
print(" brauzer (JS) → HTML → BeautifulSoup → ma'lumot")
print(" dinamik sahifa ham scraping qilindi")
print(" ⭐ Playwright/Selenium + BeautifulSoup — dinamik scraping")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Brauzer bilan sahifa olish (headless) ===
brauzer JS ishladi, HTML olindi
=== 2. BeautifulSoup bilan tahlil 26.4-bob ===
mahsulotlar soni: 2
=== 3. Ma'lumot ajratish ===
Python: 100
Go: 120
=== 4. Oqim ===
brauzer (JS) → HTML → BeautifulSoup → ma'lumot
dinamik sahifa ham scraping qilindi
⭐ Playwright/Selenium + BeautifulSoup — dinamik scrapingNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
"requests har sahifaga" |
Dinamik — brauzer kerak |
| "Brauzer doim kerak" | Statik — requests (tez) |
| "Kutish keraksiz" | JS keyinroq yuklanadi |
| "Selenium yagona" | Playwright (yangi, tez) |
| "Brauzer tez" | Sekinroq (real brauzer) |
| "Headless — cheklangan" | Server uchun (tez) |
| "Dinamik doim brauzer" | API bor bo'lsa — requests |
| "Brauzer arzon" | Ko'p resurs (xotira) |
6. Keng tarqalgan xatolar va yechimlari
1. Dinamik sahifaga requests
requests.get(dinamik_url) # bo'sh HTML # ⚠️
# Playwright/Selenium (brauzer) # ✅2. Kutmasdan element olish
page.locator(".narx").text_content() # hali yo'q # ⚠️
page.wait_for_selector(".narx"); ... # ✅3. Statik sahifaga brauzer (ortiqcha)
# Playwright statik sahifaga # ⚠️ sekin
requests.get(statik_url) # tez # ✅4. Brauzerni yopmaslik (resurs)
browser = launch(); ... # yopilmaydi # ⚠️ xotira
with sync_playwright() as p: ... # avtomatik yopadi # ✅5. Eski Selenium (yangi loyiha)
# yangi loyihada Selenium # ⚠️ (murakkabroq)
# Playwright (avtomatik kutish, tez) # ✅6. API borligini tekshirmaslik
# dinamik sahifa → darrov brauzer # ⚠️
# API bormi? (tarmoq — 26.3) # ✅ afzal7. Headless emas (ishlab chiqarish)
launch(headless=False) # serverda ekran yo'q # ⚠️
launch(headless=True) # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 26.3-dars (o'tilgan): requests — statik
- 26.4-dars (o'tilgan): BeautifulSoup — HTML tahlil
- 26.6-dars: Scraping etikasi
- 17-qism (o'tilgan): Test — Playwright veb test
- 31-qism: Loyihalar — scraping loyiha
8. Eng yaxshi amaliyotlar
Statik → requests, dinamik → brauzer.
API bormi tekshir (afzal — 26.3).
Yangi loyiha → Playwright.
Kut (
wait— JS yuklanishi).Headless (ishlab chiqarishda).
Brauzerni yop (
with— resurs).Brauzer — oxirgi chora (qimmat).
content() → BeautifulSoup (tahlil).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # statik sahifa nima?
2. # dinamik sahifa nima?
3. # Selenium/Playwright nima?
4. # goto nima?
5. # click/fill nima?
6. # locator nima?
7. # wait nega?
8. # headless nima?
9. # Selenium vs Playwright?
10. # brauzer requests'dan?
11. # qachon brauzer?
12. # brauzer qimmatmi?Javoblar
- Server tayyor HTML (requests ko'radi)
- JS quradi (requests ko'rmaydi)
- Brauzerni kod bilan boshqarish
- Sahifaga o'tish
- Bosish / forma to'ldirish
- Element topish
- JS keyinroq yuklanadi
- Ekransiz brauzer
- Selenium eski, Playwright yangi/tez
- Sekinroq (real brauzer)
- Dinamik (JS) sahifa
- Ha (ko'p resurs, sekin)
Vazifa 2: Xatolarni tuzating
1. requests.get(dinamik_url) # brauzer
2. page.locator(".narx") # kutmasdan # wait
3. # Playwright statik sahifaga # requests
4. browser=launch(); ... # yopilmaydi # with
5. launch(headless=False) # serverda # TrueJavoblar
1. Playwright/Selenium (brauzer)
2. page.wait_for_selector(".narx"); ...
3. requests.get(statik_url)
4. with sync_playwright() as p: ...
5. launch(headless=True)Vazifa 3: Statik/dinamik
Farq:
- Statik (requests)
- Dinamik (brauzer)
- Belgi
- Tanlov
Vazifa 4: Amallar
Brauzer:
gotofillclickcontent
Vazifa 5: Kutish/element
Dinamik:
waitlocator- Nega kutish
- Element
Vazifa 6: Oqim
Scraping:
- Brauzer
- Kut
- content
- BeautifulSoup
Vazifa 7: O'ylash
Dinamik scraping (Selenium/Playwright) kuchli (JS sahifa), lekin qimmatroq (sekin, ko'p resurs). Qoida: avval requests (statik — tez), kerak bo'lsa brauzer (dinamik). Nima uchun "eng oddiy vosita yetsa — uni ishlat" (requests → brauzer), va nega "eng kuchli vosita har doim yaxshi emas" — vosita tanlovida soddalik va kuch orasidagi muvozanat nega muhim?
Javob
Qisqa javob: "Eng oddiy vosita yetsa — uni ishlat" (requests → BeautifulSoup → brauzer — soddadan murakkabga), chunki har vosita narxi bor: requests (tez, arzon — statik), brauzer (sekin, ko'p resurs — dinamik). Eng kuchli vosita (brauzer) har doim yaxshi emas, chunki: keraksiz murakkablik (statik sahifaga brauzer — ortiqcha), sekin (real brauzer — JS, sahifa yuklash), ko'p resurs (xotira). "Soddalik va kuch muvozanati": muammoga mos vosita — statik → requests (sodda, tez), dinamik → brauzer (kuchli, kerak). Eng kuchli vositani har joyda ishlatish — resurs isrofi, murakkablik. Bu 23.11 (SQL/NoSQL), 24.12 (pandas/Polars), 25.1 (ML/qoida) kabi "to'g'ri vosita to'g'ri ish uchun" tamoyili. "Bolg'a bilan mix qoq, vint uchun otvertka" — vositani ishga mos tanla, eng kuchlini emas.
1. Vosita narxi
| Vosita | Narx |
|---|---|
| requests | Tez, arzon (statik) |
| BeautifulSoup | Yengil (HTML tahlil) |
| Brauzer | Sekin, ko'p resurs (dinamik) |
2. Eng kuchli har doim emas
Brauzer (eng kuchli) statik sahifaga — ortiqcha (sekin, resurs). Keraksiz murakkablik. Kuch — narx bilan.
3. Soddalik va kuch muvozanati
- Statik → requests (sodda, yetarli)
- Dinamik → brauzer (kuchli, kerak)
Muammoga mos vosita — eng oddiy yetadigani.
4. "To'g'ri vosita to'g'ri ish uchun"
23.11 (SQL/NoSQL), 24.12 (pandas/Polars), 25.1 (ML/qoida) — bir tamoyil. Eng kuchli emas, mos vosita.
5. Muhandislik saboqlari
- Har vosita narxi bor (sodda/kuchli)
- Eng oddiy yetadigani ishlat
- Eng kuchli har doim yaxshi emas
- Soddalik va kuch muvozanati
6. Xulosa
- requests → brauzer (soddadan murakkabga)
- Brauzer qimmat (dinamikda kerak)
- Mos vosita (eng kuchli emas)
- To'g'ri vosita to'g'ri ish uchun
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda Selenium/Playwright bilan dinamik scraping'ni o'rgandik.
Eng muhim uch fikr:
Statik vs dinamik va brauzer avtomatlashtirish. Statik sahifa — server tayyor HTML yuboradi (
requestsko'radi — 26.3–26.4 yetarli). Dinamik sahifa — JavaScript brauzerda ma'lumotni yuklaydi, sahifani quradi (requestsko'rmaydi — faqat boshlang'ich HTML; zamonaviy React/Vue saytlar). Selenium/Playwright — real brauzerni (Chrome, Firefox) kod bilan boshqaradi:goto(sahifaga),click/fill(bosish/forma),content(JS ishlagach HTML — BeautifulSoup bilan tahlil). Inson amallarini avtomatlashtiradi.Elementlar, kutish, headless. Elementlarni topish (
locator— CSS bilan, 26.4):.click(),.text_content(),.all(). Kutish (wait_for_selector) — muhim dinamik sahifada: JS ma'lumotni keyinroq yuklaydi, kutmasdan olsangizNone(hali yo'q); Playwright ko'p amalda avtomatik kutadi. Headless rejim (headless=True) — brauzer ekransiz (server, tez),headless=False(debug — ko'rinadi). Selenium (2004 — eski, keng) vs Playwright (2020 — yangi, tez, avtomatik kutish — yangi loyihaga tavsiya).Brauzer — oxirgi chora (vosita tanlovi). Dinamik scraping kuchli, lekin qimmatroq: sekinroq (real brauzer — JS, sahifa yuklash), ko'p resurs (xotira), murakkabroq (kutish). Qoida: avval
requests(statik — tez), kerak bo'lsa brauzer (dinamik). Ko'p sayt statik yoki API bor (26.3 — afzal) — brauzer keraksiz. "Eng oddiy vosita yetsa — uni ishlat" (requests → BeautifulSoup → brauzer — soddadan murakkabga): har vosita narxi bor, eng kuchli har doim yaxshi emas (statik sahifaga brauzer — ortiqcha). "To'g'ri vosita to'g'ri ish uchun" (23.11/24.12/25.1 kabi) — muammoga mos vosita, eng kuchlini emas. Brauzer — oxirgi chora (eng qimmat, lekin JS kontent uchun yagona).
Keyingi darsda scraping etikasi va cheklovlari ni o'rganamiz: robots.txt, qonuniy jihatlar, serverga hurmat, ma'lumot huquqlari — mas'uliyatli va qonuniy scraping.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!