CodeGym /Java Adesua /Python SELF TW /處理 JavaScript 內容

處理 JavaScript 內容

Python SELF TW
等級 33 , 課堂 1
開放

1. 動態頁面的介紹

如果你曾經試過從動態更新內容的網站抓取資料(使用 JavaScript), 你應該明白這會是個真正的謎題。不過別擔心!俗話說,複雜的程式碼 也是可以變得像魔法一樣。讓我們來看看 requests_html 是如何幫助我們處理這類內容的。

很明顯,並不是所有的網頁都一樣。有些頁面會直接加載內容, 而另一些則使用 JavaScript 動態生成或更新內容。 對於想要提取資料的人來說,這會引發一些挑戰,因為開發工具中 看到的 HTML 與透過標準請求獲取的 HTML 可能不同。

抓取動態內容時遇到的問題

大多數網頁庫,比如 requests,只能處理伺服器的回應,並不能執行 JavaScript。這意味著如果內容是透過 JavaScript 加載或更新的, 標準請求可能完全看不到這些內容。

2. 使用 requests_html

這時候 requests_html 登場了——這是一個結合了 requests 的簡單性和執行 JavaScript 的瀏覽器功能的庫。 它提供了一個基本的渲染引擎,讓我們可以像使用真實瀏覽器一樣 與動態網頁互動。

安裝與設置

開始之前,我們需要安裝 requests_html。打開你常用的 終端並執行以下命令:

Bash
pip install requests-html

完美!庫已經安裝好,現在我們可以開始使用它啦。

使用 requests_html 抓取 JavaScript 內容的基礎

requests_html 讓我們的生活簡單多了。來看看這是怎麼做到的。 假設我們有一個透過 JavaScript 生成數據的頁面。

Python

from requests_html import HTMLSession

# 創建 HTML Session
session = HTMLSession()

# 發送請求到網頁
response = session.get('https://example-dynamic-page.com')

# 渲染 JavaScript
response.html.render()

# 提取數據
data = response.html.find('#dynamic-content', first=True)
print(data.text)

真的是魔法!不同於 requests,requests_html 給我們提供了 .render() 方法,可以「執行」頁面並運行 JavaScript。一旦頁面「活」了,我們就可以用之前學過的選擇器 提取需要的數據。

3. 提取數據範例

接下來我們深入一點,看看一些範例,以更好理解 requests_html 如何在各種情境中助我們一臂之力。

從動態頁面抓取數據的實例

想像一個只在滾動後才顯示最新新聞的頁面。 使用 requests_html 我們可以模擬用戶行為。

Python

url = 'https://example-news-site.com'

# 加載頁面
response = session.get(url)

# 執行渲染,必要時設置更長的 timeout
response.html.render(timeout=20)

# 查找新聞項目元素
news_items = response.html.find('.news-item')

for item in news_items:
print(item.text)

看吧,我們輕鬆拿到那些以往難以捉摸的內容!

使用 requests_html 處理加載的 JavaScript 內容

通過 requests_html 和我們在之前講座學到的 CSS 選擇器, 你可以像已經練習了多年抓取一樣處理網頁內容!

Python

# 選擇第一個新聞標題
headline = response.html.find('.news-headline', first=True)
print(headline.text)

# 提取鏈接
link = headline.find('a', first=True).attrs['href']
print(link)

4. 實用技巧與提示

雖然 requests_html 很強大,但使用時需要注意以下幾點:

  • 超時與延遲: 別忘了為更複雜的頁面設置渲染超時, 以避免因加載過慢導致錯誤。
  • 渲染資源: requests_html 渲染 JavaScript 會消耗大量資源,對於大數據量或複雜頁面會拖慢速度。
  • 防機器人保護: requests_html 無法繞過 CAPTCHA 或反爬蟲保護。對於更複雜的情況,建議使用 Selenium。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION