1. 動態頁面的介紹
如果你曾經試過從動態更新內容的網站抓取資料(使用 JavaScript),
你應該明白這會是個真正的謎題。不過別擔心!俗話說,複雜的程式碼
也是可以變得像魔法一樣。讓我們來看看
requests_html
是如何幫助我們處理這類內容的。
很明顯,並不是所有的網頁都一樣。有些頁面會直接加載內容, 而另一些則使用 JavaScript 動態生成或更新內容。 對於想要提取資料的人來說,這會引發一些挑戰,因為開發工具中 看到的 HTML 與透過標準請求獲取的 HTML 可能不同。
抓取動態內容時遇到的問題
大多數網頁庫,比如 requests,只能處理伺服器的回應,並不能執行 JavaScript。這意味著如果內容是透過 JavaScript 加載或更新的, 標準請求可能完全看不到這些內容。
2. 使用 requests_html
庫
這時候 requests_html
登場了——這是一個結合了
requests 的簡單性和執行 JavaScript 的瀏覽器功能的庫。
它提供了一個基本的渲染引擎,讓我們可以像使用真實瀏覽器一樣
與動態網頁互動。
安裝與設置
開始之前,我們需要安裝 requests_html
。打開你常用的
終端並執行以下命令:
pip install requests-html
完美!庫已經安裝好,現在我們可以開始使用它啦。
使用 requests_html
抓取 JavaScript 內容的基礎
requests_html
讓我們的生活簡單多了。來看看這是怎麼做到的。
假設我們有一個透過 JavaScript 生成數據的頁面。
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
我們可以模擬用戶行為。
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 選擇器,
你可以像已經練習了多年抓取一樣處理網頁內容!
# 選擇第一個新聞標題
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。
GO TO FULL VERSION