Вэб хусах (requests + BeautifulSoup)
Web scraping гэдэг нь вэб хуудаснаас өгөгдөл автоматаар татах үйлдэл. Жишээлбэл: мэдээний сайтаас нийтлэлийн гарчиг цуглуулах, дэлгүүрийн үнэ хянах, тендер мэдээлэл татах зэрэг. Python-д requests ба BeautifulSoup хос хамгийн түгээмэл хэрэгсэл.
Суулгах
pip install requests beautifulsoup4
Эдгээр хоёр пакеж стандарт биш тул суулгах шаардлагатай. requests нь HTTP хүсэлт илгээдэг, BeautifulSoup нь HTML задалдаг.
requests — вэб хуудас татах
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 татаад дотроос хэрэгтэй мэдээллийг гаргаж авна:
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 илүү танил байж болно:
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()}")
Алдаа зохицуулах ба хүлээлт
Бодит вэб хусахад сүлжээний алдаа, хуудас олдохгүй байх зэрэг нөхцөл гарна — заавал зохицуулах хэрэгтэй:
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-уудтай холбогдох аргыг сурна.