使用Python獲取JS加載的數(shù)據(jù)的多種實(shí)現(xiàn)方法
引言
在當(dāng)今的互聯(lián)網(wǎng)時(shí)代,網(wǎng)頁(yè)數(shù)據(jù)的動(dòng)態(tài)加載已經(jīng)成為一種常見(jiàn)的技術(shù)手段。許多現(xiàn)代網(wǎng)站通過(guò)JavaScript(JS)動(dòng)態(tài)加載內(nèi)容,這使得傳統(tǒng)的靜態(tài)網(wǎng)頁(yè)爬取方法難以奏效。然而,對(duì)于數(shù)據(jù)分析師、研究人員以及開(kāi)發(fā)者來(lái)說(shuō),獲取這些動(dòng)態(tài)加載的數(shù)據(jù)仍然是一個(gè)重要的需求。本文將詳細(xì)介紹如何使用Python來(lái)爬取JavaScript加載的數(shù)據(jù),包括技術(shù)原理、實(shí)現(xiàn)方法以及代碼示例。
一、動(dòng)態(tài) 網(wǎng)頁(yè)與JS加載數(shù)據(jù)的原理
在傳統(tǒng)的靜態(tài)網(wǎng)頁(yè)中,網(wǎng)頁(yè)的內(nèi)容在服務(wù)器端生成后直接發(fā)送到客戶端瀏覽器,爬蟲可以直接通過(guò)HTTP請(qǐng)求獲取完整的HTML內(nèi)容。然而,動(dòng)態(tài) 網(wǎng)頁(yè)則不同,它們通常只加載一個(gè)基本的HTML框架,而實(shí)際的內(nèi)容是通過(guò)JavaScript在客戶端動(dòng)態(tài)加載的。這些內(nèi)容可能來(lái)自服務(wù)器的API接口,也可能通過(guò)JavaScript代碼動(dòng)態(tài)生成。
JavaScript動(dòng)態(tài)加載數(shù)據(jù)的常見(jiàn)方式包括:
- AJAX請(qǐng)求:通過(guò)JavaScript的
<font style="color:rgba(0, 0, 0, 0.9);">XMLHttpRequest</font>或<font style="color:rgba(0, 0, 0, 0.9);">fetch</font>方法向服務(wù)器發(fā)送異步請(qǐng)求,獲取數(shù)據(jù)后動(dòng)態(tài)更新頁(yè)面內(nèi)容。 - 前端框架渲染:如React、Vue.js等前端框架,通過(guò)JavaScript動(dòng)態(tài)構(gòu)建DOM元素并渲染頁(yè)面內(nèi)容。
- WebSockets:通過(guò)實(shí)時(shí)通信協(xié)議動(dòng)態(tài)接收服務(wù)器推送的數(shù)據(jù)并更新頁(yè)面。
對(duì)于爬蟲來(lái)說(shuō),這些動(dòng)態(tài)加載的數(shù)據(jù)是不可見(jiàn)的,因?yàn)榕老x通常只能獲取初始的HTML頁(yè)面,而無(wú)法執(zhí)行JavaScript代碼。因此,我們需要采用一些特殊的方法來(lái)獲取這些數(shù)據(jù)。
二、Python爬取JS加載數(shù)據(jù)的方法
(一)分析網(wǎng)絡(luò)請(qǐng)求
在許多情況下,動(dòng)態(tài)加載的數(shù)據(jù)實(shí)際上是通過(guò)AJAX請(qǐng)求從服務(wù)器獲取的。因此,我們可以通過(guò)分析網(wǎng)頁(yè)的網(wǎng)絡(luò)請(qǐng)求來(lái)找到數(shù)據(jù)的來(lái)源。
1. 使用Chrome開(kāi)發(fā)者工具
打開(kāi)目標(biāo)網(wǎng)頁(yè),按<font style="color:rgba(0, 0, 0, 0.9);">F12</font>鍵打開(kāi)Chrome開(kāi)發(fā)者工具,切換到“Network”標(biāo)簽頁(yè),刷新頁(yè)面并觀察網(wǎng)絡(luò)請(qǐng)求。重點(diǎn)關(guān)注以下內(nèi)容:
- XHR請(qǐng)求:這些請(qǐng)求通常是通過(guò)AJAX發(fā)送的,返回的數(shù)據(jù)可能是JSON格式。
- Fetch請(qǐng)求:現(xiàn)代網(wǎng)頁(yè)中,
<font style="color:rgba(0, 0, 0, 0.9);">fetch</font>方法也常用于異步請(qǐng)求,返回的數(shù)據(jù)格式可能多樣。
通過(guò)分析這些請(qǐng)求的URL、請(qǐng)求方法(GET/POST)、請(qǐng)求頭和返回的數(shù)據(jù)格式,我們可以直接構(gòu)造爬蟲請(qǐng)求來(lái)獲取數(shù)據(jù)。
2. 示例代碼:通過(guò)分析網(wǎng)絡(luò)請(qǐng)求獲取數(shù)據(jù)
假設(shè)我們發(fā)現(xiàn)了一個(gè)返回JSON數(shù)據(jù)的AJAX請(qǐng)求,其URL為<font style="color:rgba(0, 0, 0, 0.9);">https://example.com/api/data</font>,請(qǐng)求方法為<font style="color:rgba(0, 0, 0, 0.9);">GET</font>。我們可以使用<font style="color:rgba(0, 0, 0, 0.9);">requests</font>庫(kù)來(lái)獲取數(shù)據(jù):
import requests
# 目標(biāo)API的URL
url = "https://example.com/api/data"
# 發(fā)送GET請(qǐng)求
response = requests.get(url)
# 檢查響應(yīng)狀態(tài)碼
if response.status_code == 200:
# 解析JSON數(shù)據(jù)
data = response.json()
print(data)
else:
print("Failed to retrieve data")
(二)使用Selenium模擬瀏覽器行為
如果網(wǎng)頁(yè)的數(shù)據(jù)是通過(guò)復(fù)雜的JavaScript動(dòng)態(tài)生成的,或者需要與頁(yè)面交互才能加載數(shù)據(jù),我們可以使用Selenium來(lái)模擬瀏覽器行為。
1. Selenium簡(jiǎn)介
Selenium是一個(gè)自動(dòng)化測(cè)試工具,可以模擬用戶在瀏覽器中的操作,如點(diǎn)擊、輸入、滾動(dòng)等。通過(guò)Selenium,我們可以加載完整的網(wǎng)頁(yè),執(zhí)行JavaScript代碼,并獲取最終渲染后的頁(yè)面內(nèi)容。
2. 安裝Selenium和瀏覽器驅(qū)動(dòng)
在使用Selenium之前,需要安裝Selenium庫(kù)以及對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)。以Chrome為例:
下載ChromeDriver:訪問(wèn)ChromeDriver - WebDriver for Chrome,下載與你的Chrome瀏覽器版本匹配的驅(qū)動(dòng)程序,并將其路徑添加到系統(tǒng)的環(huán)境變量中。
3. 示例代碼:使用Selenium獲取動(dòng)態(tài)加載的數(shù)據(jù)
以下是一個(gè)使用Selenium獲取動(dòng)態(tài)加載數(shù)據(jù)的示例代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 初始化Chrome瀏覽器
driver = webdriver.Chrome()
# 打開(kāi)目標(biāo)網(wǎng)頁(yè)
driver.get("https://example.com")
# 等待頁(yè)面加載(可以根據(jù)實(shí)際情況調(diào)整等待時(shí)間)
time.sleep(5)
# 找到動(dòng)態(tài)加載的數(shù)據(jù)元素(假設(shè)數(shù)據(jù)在某個(gè)特定的div中)
data_element = driver.find_element(By.ID, "data-container")
# 獲取元素的文本內(nèi)容
data = data_element.text
print(data)
# 關(guān)閉瀏覽器
driver.quit()
(三)使用Pyppeteer進(jìn)行無(wú)頭瀏覽器爬取
Pyppeteer是一個(gè)基于Chromium的無(wú)頭瀏覽器庫(kù),它提供了更輕量級(jí)的解決方案,適合在服務(wù)器環(huán)境中運(yùn)行。與Selenium類似,Pyppeteer可以模擬瀏覽器行為,加載完整的網(wǎng)頁(yè)并執(zhí)行JavaScript代碼。
1. 示例代碼:使用Pyppeteer獲取動(dòng)態(tài)加載的數(shù)據(jù)
以下是一個(gè)使用Pyppeteer獲取動(dòng)態(tài)加載數(shù)據(jù)的示例代碼:
import asyncio
from pyppeteer import launch
async def main():
# 啟動(dòng)無(wú)頭瀏覽器
browser = await launch(headless=False) # 設(shè)置為False可以打開(kāi)瀏覽器窗口,方便調(diào)試
page = await browser.newPage()
# 打開(kāi)目標(biāo)網(wǎng)頁(yè)
await page.goto("https://example.com")
# 等待頁(yè)面加載(可以根據(jù)實(shí)際情況調(diào)整等待時(shí)間)
await asyncio.sleep(5)
# 執(zhí)行JavaScript代碼獲取動(dòng)態(tài)加載的數(shù)據(jù)
data = await page.evaluate("() => document.querySelector('#data-container').innerText")
print(data)
# 關(guān)閉瀏覽器
await browser.close()
# 運(yùn)行異步主函數(shù)
asyncio.run(main())
三、實(shí)踐案例:爬取某電商網(wǎng)站的商品信息
假設(shè)我們要爬取一個(gè)電商網(wǎng)站的商品信息,該網(wǎng)站通過(guò)JavaScript動(dòng)態(tài)加載商品列表。我們將通過(guò)分析網(wǎng)絡(luò)請(qǐng)求和使用Selenium來(lái)實(shí)現(xiàn)爬取。
(一)分析網(wǎng)絡(luò)請(qǐng)求
通過(guò)Chrome開(kāi)發(fā)者工具,我們發(fā)現(xiàn)商品數(shù)據(jù)是通過(guò)AJAX請(qǐng)求從<font style="color:rgba(0, 0, 0, 0.9);">https://example.com/api/products</font>獲取的,返回的是JSON格式的數(shù)據(jù)。
(二)使用<font style="color:rgba(0, 0, 0, 0.9);">requests</font>庫(kù)獲取數(shù)據(jù)
import requests
# 目標(biāo)API的URL
url = "https://example.com/api/products"
# 發(fā)送GET請(qǐng)求
response = requests.get(url)
# 檢查響應(yīng)狀態(tài)碼
if response.status_code == 200:
# 解析JSON數(shù)據(jù)
products = response.json()
for product in products:
print(product["name"], product["price"])
else:
print("Failed to retrieve data")
(三)使用Selenium獲取完整頁(yè)面內(nèi)容
如果商品數(shù)據(jù)需要用戶交互才能加載,我們可以使用Selenium來(lái)模擬用戶操作并獲取完整頁(yè)面內(nèi)容。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.proxy import Proxy, ProxyType
import time
# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
# 設(shè)置代理
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyHost}:{proxyPort}"
proxy.ssl_proxy = f"{proxyHost}:{proxyPort}"
# 設(shè)置代理認(rèn)證信息(如果需要)
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
# 初始化Chrome瀏覽器
driver = webdriver.Chrome(desired_capabilities=capabilities)
# 打開(kāi)目標(biāo)網(wǎng)頁(yè)
driver.get("https://example.com")
# 等待頁(yè)面加載
time.sleep(5)
# 模擬用戶滾動(dòng)頁(yè)面加載更多商品
for _ in range(3):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
# 獲取商品列表
try:
products = driver.find_elements(By.CLASS_NAME, "product-item")
for product in products:
name = product.find_element(By.CLASS_NAME, "product-name").text
price = product.find_element(By.CLASS_NAME, "product-price").text
print(name, price)
except Exception as e:
print("No products found or error occurred:", e)
# 關(guān)閉瀏覽器
driver.quit()
四、注意事項(xiàng)
- 遵守法律法規(guī):在進(jìn)行網(wǎng)頁(yè)爬取時(shí),必須遵守相關(guān)法律法規(guī),尊重網(wǎng)站的
<font style="color:rgba(0, 0, 0, 0.9);">robots.txt</font>文件和使用條款。 - 數(shù)據(jù)隱私:不要爬取涉及用戶隱私或敏感信息的數(shù)據(jù)。
- 反爬蟲機(jī)制:許多網(wǎng)站會(huì)設(shè)置反爬蟲機(jī)制,如限制訪問(wèn)頻率、檢測(cè)用戶代理等。在爬取時(shí)要注意合理設(shè)置請(qǐng)求間隔,避免被封禁IP。
- 性能優(yōu)化:對(duì)于大規(guī)模數(shù)據(jù)爬取,可以考慮使用分布式爬蟲框架,如Scrapy,以提高效率。
五、總結(jié)
Python提供了多種方法來(lái)爬取JavaScript加載的數(shù)據(jù),包括分析網(wǎng)絡(luò)請(qǐng)求、使用Selenium模擬瀏覽器行為以及使用Pyppeteer進(jìn)行無(wú)頭瀏覽器爬取。在實(shí)際應(yīng)用中,可以根據(jù)目標(biāo)網(wǎng)頁(yè)的特點(diǎn)和需求選擇合適的方法。通過(guò)本文的介紹和代碼示例,相信你已經(jīng)掌握了動(dòng)態(tài) 網(wǎng)頁(yè)爬取的基本技巧。希望這些內(nèi)容能幫助你在數(shù)據(jù)爬取的道路上更進(jìn)一步。
以上就是使用Python獲取JS加載的數(shù)據(jù)的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于Python獲取JS加載數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
tensorflow卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析
這篇文章主要為大家介紹了卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python 模擬動(dòng)態(tài)產(chǎn)生字母驗(yàn)證碼圖片功能
這篇文章主要介紹了Python 模擬動(dòng)態(tài)產(chǎn)生字母驗(yàn)證碼圖片,這里給大家介紹了pillow模塊的使用,需要的朋友可以參考下2019-12-12
Python在Excel單元格中應(yīng)用多種字體樣式的代碼示例
文在數(shù)據(jù)處理和報(bào)表生成場(chǎng)景中,Excel 文件的格式設(shè)置至關(guān)重要,合理的字體格式不僅能提升表格的可讀性,還能突出關(guān)鍵數(shù)據(jù),本文將詳細(xì)介紹如何使用免費(fèi)庫(kù)Free Spire.XLS for Python,在 Excel 單元格中靈活應(yīng)用多種字體格式,需要的朋友可以參考下2025-05-05
python利用裝飾器進(jìn)行運(yùn)算的實(shí)例分析
本文主要是通過(guò)使用Python的裝飾器來(lái)做一個(gè)運(yùn)算的實(shí)例,來(lái)給大家詳細(xì)介紹下Python的裝飾器,非常的實(shí)用,有需要的小伙伴可以參考下。2015-08-08
python cx_Oracle模塊的安裝和使用詳細(xì)介紹
這篇文章主要介紹了python cx_Oracle模塊的安裝和使用詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02
Python基于jieba分詞實(shí)現(xiàn)snownlp情感分析
情感分析(sentiment analysis)是2018年公布的計(jì)算機(jī)科學(xué)技術(shù)名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負(fù)面的等。本文將通過(guò)jieba分詞實(shí)現(xiàn)snownlp情感分析,感興趣的可以了解一下2023-01-01

