# 08. Web Document (WebBaseLoader)

## WebBaseLoader

`WebBaseLoader` adalah pemuat yang memuat dokumen berbasis web.

Menggunakan pustaka `bs4` untuk mengurai halaman web.

* Menggunakan `bs4.SoupStrainer` untuk menentukan elemen yang akan diurai.
* Gunakan parameter `bs_kwargs` untuk menentukan argumen tambahan untuk `bs4.SoupStrainer`.

Lihat

* [Dokumentasi API](https://api.python.langchain.com/en/latest/document_loaders/langchain_community.document_loaders.web_base.WebBaseLoader.html)

```python
import bs4
from langchain_community.document_loaders import WebBaseLoader

# Memuat konten artikel berita.
loader = WebBaseLoader(
    web_paths=("https://n.news.naver.com/article/437/0000378416",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

docs = loader.load()
print(f"Jumlah dokumen: {len(docs)}")
docs
```

Untuk mengatasi kesalahan autentikasi SSL, Anda dapat mengatur opsi `“verifikasi”`.

```python
# Lewati autentikasi SSL
loader.requests_kwargs = {"verify": False}

# Memuat data
docs = loader.load()
```

Anda juga dapat memuat beberapa halaman web sekaligus. Untuk melakukan ini, Anda dapat mengoper daftar URL ke pemuat, yang akan mengembalikan daftar dokumen dalam urutan URL yang dioper.

```python
loader = WebBaseLoader(
    web_paths=[
        "https://n.news.naver.com/article/437/0000378416",
        "https://n.news.naver.com/mnews/hotissue/article/092/0002340014?type=series&cid=2000063",
    ],
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["newsct_article _article_body", "media_end_head_title"]},
        )
    ),
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36",
    },
)

# Muat data
docs = loader.load()

# Periksa jumlah dokumen
print(len(docs))
```

Keluarkan hasil yang diambil dari web.

```python
print(docs[0].page_content[:500])
print("===" * 10)
print(docs[1].page_content[:500])
```

Anda dapat mempercepat proses pengikisan dengan mengikis beberapa URL secara bersamaan.

Ada batas yang wajar untuk permintaan bersamaan, yang standarnya adalah dua per detik. Jika Anda tidak khawatir dengan beban server, atau jika Anda mengontrol server tempat Anda mengikis, Anda dapat meningkatkan jumlah maksimum permintaan bersamaan dengan mengubah parameter `requests_per_second`. Hal ini dapat mempercepat pengikisan, tetapi Anda harus berhati-hati karena Anda mungkin akan diblokir oleh server.

```python
# Jalankan pada jupyter notebook(asyncio)
import nest_asyncio

nest_asyncio.apply()
```

```python
# Mengatur jumlah permintaan per detik
loader.requests_per_second = 1

# Muat data
docs = loader.aload()
```

```python
# Keluarkan hasilnya
docs
```

## Menggunakan proxy

***

Anda mungkin perlu menggunakan proxy untuk menerobos pemblokiran IP.

Untuk menggunakan proxy, Anda dapat mengoper kamus proxy ke pemuat (dan `request` di bawahnya).

```python
loader = WebBaseLoader(
    "https://www.google.com/search?q=parrots",py
    proxies={
        "http": "http://{username}:{password}:@proxy.service.com:6666/",
        "https": "https://{username}:{password}:@proxy.service.com:6666/",
    },
    # Inisialisasi pemuat berbasis web
    # Menyiapkan proxy
)

# Muat dokumen
docs = loader.load()
```
