IlmHamroh
Python kursi/Avtomatlashtirish5/10-dars16 daqiqa
Mundarija (22)

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:

python
# 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:

python
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:

python
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:

python
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:

python
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

python
# 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)

python
"""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:

text
=== 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 tanlash

Nima ko'rsatdi: 2.1-bo'lim.

Misol 2 — Brauzer amallari (mock)

python
"""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:

text
=== 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/content

Nima ko'rsatdi: 2.2, 2.3-bo'limlar.

Misol 3 — Kutish va elementlar (mock)

python
"""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:

text
=== 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 kaliti

Nima 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).

python
"""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:

text
=== 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 scraping

Nima 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

python
requests.get(dinamik_url)   # bo'sh HTML                # ⚠️
# Playwright/Selenium (brauzer)                          # ✅

2. Kutmasdan element olish

python
page.locator(".narx").text_content()   # hali yo'q      # ⚠️
page.wait_for_selector(".narx"); ...                     # ✅

3. Statik sahifaga brauzer (ortiqcha)

python
# Playwright statik sahifaga                             # ⚠️ sekin
requests.get(statik_url)   # tez                          # ✅

4. Brauzerni yopmaslik (resurs)

python
browser = launch(); ...   # yopilmaydi                   # ⚠️ xotira
with sync_playwright() as p: ...   # avtomatik yopadi     # ✅

5. Eski Selenium (yangi loyiha)

python
# yangi loyihada Selenium                                # ⚠️ (murakkabroq)
# Playwright (avtomatik kutish, tez)                      # ✅

6. API borligini tekshirmaslik

python
# dinamik sahifa → darrov brauzer                        # ⚠️
# API bormi? (tarmoq — 26.3)                              # ✅ afzal

7. Headless emas (ishlab chiqarish)

python
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

  1. Statik → requests, dinamik → brauzer.

  2. API bormi tekshir (afzal — 26.3).

  3. Yangi loyiha → Playwright.

  4. Kut (wait — JS yuklanishi).

  5. Headless (ishlab chiqarishda).

  6. Brauzerni yop (with — resurs).

  7. Brauzer — oxirgi chora (qimmat).

  8. content() → BeautifulSoup (tahlil).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. Server tayyor HTML (requests ko'radi)
  2. JS quradi (requests ko'rmaydi)
  3. Brauzerni kod bilan boshqarish
  4. Sahifaga o'tish
  5. Bosish / forma to'ldirish
  6. Element topish
  7. JS keyinroq yuklanadi
  8. Ekransiz brauzer
  9. Selenium eski, Playwright yangi/tez
  10. Sekinroq (real brauzer)
  11. Dinamik (JS) sahifa
  12. Ha (ko'p resurs, sekin)

Vazifa 2: Xatolarni tuzating

python
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    # True
Javoblar
python
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:

  1. Statik (requests)
  2. Dinamik (brauzer)
  3. Belgi
  4. Tanlov

Vazifa 4: Amallar

Brauzer:

  1. goto
  2. fill
  3. click
  4. content

Vazifa 5: Kutish/element

Dinamik:

  1. wait
  2. locator
  3. Nega kutish
  4. Element

Vazifa 6: Oqim

Scraping:

  1. Brauzer
  2. Kut
  3. content
  4. 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

  1. Har vosita narxi bor (sodda/kuchli)
  2. Eng oddiy yetadigani ishlat
  3. Eng kuchli har doim yaxshi emas
  4. Soddalik va kuch muvozanati

6. Xulosa

  1. requests → brauzer (soddadan murakkabga)
  2. Brauzer qimmat (dinamikda kerak)
  3. Mos vosita (eng kuchli emas)
  4. 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:

  1. Statik vs dinamik va brauzer avtomatlashtirish. Statik sahifa — server tayyor HTML yuboradi (requests ko'radi — 26.3–26.4 yetarli). Dinamik sahifa — JavaScript brauzerda ma'lumotni yuklaydi, sahifani quradi (requests ko'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.

  2. 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 olsangiz None (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).

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!