Python / Вэб хусах (requests + BeautifulSoup)

Вэб хусах (requests + BeautifulSoup)

Web scraping гэдэг нь вэб хуудаснаас өгөгдөл автоматаар татах үйлдэл. Жишээлбэл: мэдээний сайтаас нийтлэлийн гарчиг цуглуулах, дэлгүүрийн үнэ хянах, тендер мэдээлэл татах зэрэг. Python-д requests ба BeautifulSoup хос хамгийн түгээмэл хэрэгсэл.

Суулгах

bash
pip install requests beautifulsoup4

Эдгээр хоёр пакеж стандарт биш тул суулгах шаардлагатай. requests нь HTTP хүсэлт илгээдэг, BeautifulSoup нь HTML задалдаг.

requests — вэб хуудас татах

python
import requests

хариу = requests.get("https://httpbin.org/get")

print(хариу.status_code)   # 200
print(хариу.headers["Content-Type"])
print(хариу.json())        # JSON хариуг dict болгон буцаана

status_code нь HTTP хариу кодыг харуулна:

| Код | Утга | | --- | --- | | 200 | Амжилттай | | 404 | Олдсонгүй | | 403 | Хандах эрхгүй | | 500 | Серверийн алдаа |

BeautifulSoup — HTML задлах

HTML татаад дотроос хэрэгтэй мэдээллийг гаргаж авна:

python
import requests
from bs4 import BeautifulSoup

# HTML татах
хариу = requests.get("https://books.toscrape.com/")
суп = BeautifulSoup(хариу.text, "html.parser")

# Бүх номын гарчгийг олох
номнууд = суп.find_all("article", class_="product_pod")

for ном in номнууд[:5]:
    гарчиг = ном.find("h3").find("a")["title"]
    үнэ = ном.find("p", class_="price_color").text
    print(f"{гарчиг}{үнэ}")

find() нь эхний тохирсон элементийг, find_all() нь бүгдийг жагсаалтаар буцаана.

CSS selector ашиглах

jQuery эсвэл JavaScript мэддэг бол CSS selector илүү танил байж болно:

python
import requests
from bs4 import BeautifulSoup

хариу = requests.get("https://books.toscrape.com/")
суп = BeautifulSoup(хариу.text, "html.parser")

# CSS selector — jQuery шиг ажилладаг
гарчгууд = суп.select("article.product_pod h3 a")
үнэнүүд   = суп.select("p.price_color")

for гарчиг, үнэ in zip(гарчгууд[:3], үнэнүүд[:3]):
    print(f"{гарчиг['title']}{үнэ.text.strip()}")

Алдаа зохицуулах ба хүлээлт

Бодит вэб хусахад сүлжээний алдаа, хуудас олдохгүй байх зэрэг нөхцөл гарна — заавал зохицуулах хэрэгтэй:

python
import requests
from bs4 import BeautifulSoup
import time

холбоосууд = [
    "https://books.toscrape.com/catalogue/page-1.html",
    "https://books.toscrape.com/catalogue/page-2.html",
]

for холбоос in холбоосууд:
    try:
        хариу = requests.get(холбоос, timeout=10)
        хариу.raise_for_status()   # 4xx, 5xx алдаанд exception үүсгэнэ
        суп = BeautifulSoup(хариу.text, "html.parser")
        тоо = len(суп.select("article.product_pod"))
        print(f"Олдсон ном: {тоо}")
    except requests.RequestException as алдаа:
        print(f"Алдаа: {алдаа}")
    finally:
        time.sleep(1)   # серверт ачаалал өгөхгүйн тулд хүлээнэ

time.sleep(1) нь чухал — хэт хурдан хүсэлт илгээвэл сайт таны IP-г хаах эрсдэлтэй.

Анхааруулга

Вэб хусахаас өмнө сайтын robots.txt файлыг шалгаарай — зарим сайт автоматаар хандахыг хориглодог. Жишээ: https://example.com/robots.txt. Хориглосон хуудаснуудыг хуслыг дагах нь ёс суртахуун болон хуулийн асуудал үүсгэж болно.

Дараагийн хичээлд:

API-тай ажиллах — JSON API-аас мэдээлэл татах, authentication дамжуулах, бодит дэлхийн API-уудтай холбогдох аргыг сурна.