1. 動態內容和 JavaScript
如果你已經掌握了使用像 BeautifulSoup 和 requests 這樣的庫進行網頁爬取的基礎,那麼現在是時候進一步深入探索這項有趣的技能了。 今天,我們會聊聊如何處理僅在滾動頁面時才動態加載的內容。🤖 現在不僅你的瀏覽器可以欣賞無盡的滾動,你的腳本也可以做到!
網際網路充滿了動態加載的頁面,內容只有在與 JavaScript 互動後才會更新並顯示出來。這可以是爬取內容的恩賜,也可以是一種挑戰。 一方面,這些網站對於用戶來說更加互動友好;另一方面,requests 庫無法理解 JavaScript,因此爬取這些頁面變得更加棘手。
2. 庫 requests_html
幸運的是,我們有 requests_html,它結合了 requests 的強大功能以及基於 Pyppeteer 支持的類瀏覽器渲染。 這個庫允許加載和渲染具有動態內容的頁面,甚至還能執行 JavaScript 和模擬滾動。
安裝 requests_html
開始之前,需要先安裝這個庫。如果還沒安裝,可以使用以下命令進行安裝:
pip install requests-html
使用 requests_html
安裝完成後,我們來看看如何利用 requests_html 加載和處理動態內容。
範例:加載和渲染頁面
從簡單的範例開始:加載頁面、執行 JavaScript 並提取數據。我們假設我們需要訪問某個加載完成後才顯示的文本元素。
from requests_html import HTMLSession
# 建立 session
session = HTMLSession()
# 加載頁面
response = session.get('https://example.com/dynamic-page')
# 執行 JavaScript 渲染頁面
response.html.render()
# 提取渲染後顯示的元素文本
content = response.html.find('#dynamic-content', first=True)
print(content.text)
在這個範例中,我們使用了 render() 方法,讓 requests_html 能夠執行頁面上的 JavaScript 並渲染出隱藏在標準請求之後的內容。
3. 自動滾動頁面
有時候,動態內容並不會一次性加載完成,而是需要用戶滾動頁面來觸發加載。requests_html 也可以模擬這種滾動行為。
範例:自動滾動
假設你有一個帶有無限滾動的新聞頁面,你想提取盡可能多的元素。以下是實現示例:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# 渲染並滾動畫面
response.html.render(scrolldown=5, sleep=1)
# 提取所有新聞元素
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
在這裡,render() 方法使用了 scrolldown 和 sleep 參數,分別表示滾動幾次以及每次滾動間隔的等待時間。
4. 實踐應用
為什麼要去研究自動滾動這些看似麻煩的事情呢?🤔
- 市場調研: 很多公司使用這些頁面來展示連續的數據,這些數據對於分析趨勢和消費者行為非常有用。
- 社交網絡監測: 很多社交平台使用無限滾動的形式,讓
requests_html成為收集這些數據的利器。 - 新聞與更新: 從新聞站點的無限滾動頁面提取標題和文章,幫助快速獲得最新的信息。
5. 常見錯誤及解決方案
使用動態頁面和 requests_html 時,可能會遇到一些錯誤。我們來看看常見問題:
渲染問題
有時候 render() 方法可能會失敗,特別是當頁面過大或過於複雜時。在這種情況下,可以嘗試增加渲染時長,或減少滾動次數。
response.html.render(timeout=30)
腳本執行問題
某些情況下,頁面上的 JavaScript 可能會阻止腳本的執行,或者引發問題。可以試著使用 wait 參數來等待元素載入。
response.html.render(wait=2)
屏幕分辨率與設備類型
某些網站可能依靠屏幕分辨率或設備類型來向用戶提供內容。檢查 user-agent 是否正確,並確保渲染行為與期待相符。
response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
6. 更多學習資源
requests_html 是一個非常強大的工具。如果你希望充分利用其功能並避免常見問題,建議參考 官方文檔,它能幫助你更好地理解滾動操作及其在複雜頁面上的運行。
現在你已經了解了處理動態內容和無限滾動所需的所有知識,繼續探索並享受自動化的樂趣吧! 記得表明你的腳本是為了幫助人們自動化工作,而不是做壞事的哦!😇
GO TO FULL VERSION