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

小白学大数据
• 阅读 32

在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段。许多现代网站通过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://example.com/api/data,请求方法为GET。我们可以使用requests库来获取数据: import requests

目标API的URL

url = "https://example.com/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://example.com")

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

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://example.com")

# 等待页面加载(可以根据实际情况调整等待时间)
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://example.com/api/products获取的,返回的是JSON格式的数据。 (二)使用requests库获取数据 import requests

目标API的URL

url = "https://example.com/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://example.com")

等待页面加载

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进行无头浏览器爬取。在实际应用中,可以根据目标网页的特点和需求选择合适的方法。通过本文的介绍和代码示例,相信你已经掌握了动态网页爬取的基本技巧。希望这些内容能帮助你在数据爬取的道路上更进一步。
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java实现根据起点终点和日期查询去哪儿网的火车车次和火车站点信息
本文章为原创文章,转载请注明,欢迎评论和改正。一,分析  之前所用的直接通过HTML中的元素值来爬取一些网页上的数据,但是一些比较敏感的数据,很多正规网站都是通过json数据存储,这些数据通过HTML元素是爬取不到的,所以只能通过json数据的api接口来爬取数据。二,网站处理  1,打开去哪儿网的网站https://train.qu
Wesley13 Wesley13
3年前
java动态加载类和静态加载类
一.什么是动态加载类什么是静态加载类Class.forName不仅表示类的类类型,还代表了动态加载类。编译时加载是静态加载类,运行时加载是动态加载类。请大家区分编译运行。二.为何要使用动态加载类我们写了一个程序并没有写A类和B类以及start方法 publicclassMain{publicstati
Stella981 Stella981
3年前
Javascript基础知识学习(三)
前言:javascript是一种轻量的、动态的脚本语言,我们为什么要使用javascript?对于一个网页的设计,.html用来放置网页的内容,.css则用来设计网页的样式和布局,那么.js它主要是使网页能够产生交互,意思就是能够通过代码动态的修改HTML、操作CSS、响应事件、获取用户计算机的相关信息等。javascript不是所有的浏览器
Stella981 Stella981
3年前
AsyncTask进度条加载网站数据到ListView
  代码介绍:  初学android,写了个一小demo。功能很简单,主要是用来学习,  知识要点:  1.android全局变量的使用(用来缓存爬取的数据)。  2.AsyncTask使用。  3.进度条加载数据  4.利用Jsoup爬取网页数据并解析!\(http://static.oschina.ne
小白学大数据 小白学大数据
2个月前
Scrapy结合Selenium实现滚动翻页数据采集
引言在当今的互联网数据采集领域,许多网站采用动态加载技术(如AJAX、无限滚动)来优化用户体验。传统的基于Requests或Scrapy的爬虫难以直接获取动态渲染的数据,而Selenium可以模拟浏览器行为,实现滚动翻页和动态内容加载。本文将介绍如何结合S
小白学大数据 小白学大数据
1个月前
Python爬虫多次请求后被要求验证码的应对策略
在互联网数据采集领域,Python爬虫是一种强大的工具,能够帮助我们高效地获取网页数据。然而,在实际应用中,许多网站为了防止恶意爬取,会在检测到频繁请求时要求用户输入验证码。这无疑给爬虫的正常运行带来了挑战。本文将详细介绍Python爬虫在多次请求后被要求
小白学大数据 小白学大数据
2星期前
Python爬虫中time.sleep()与动态加载的配合使用
一、动态加载网页的挑战动态加载网页是指网页的内容并非一次性加载完成,而是通过JavaScript等技术在用户交互或页面加载过程中逐步加载。这种设计虽然提升了用户体验,但对于爬虫来说,却增加了抓取的难度。传统的爬虫方法,如简单的HTTP请求,往往只能获取到网
Scala中如何使用Jsoup库处理HTML文档?
在当今互联网时代,数据是互联网应用程序的核心。对于开发者来说,获取并处理数据是日常工作中的重要一环。本文将介绍如何利用Scala中强大的Jsoup库进行网络请求和HTML解析,从而实现爬取京东网站的数据,让我们一起来探索吧!1.为什么选择Scala和Jso
Python进阶者 Python进阶者
1年前
想获取JS加载网页的源网页的源码,不想获取JS加载后的数据
大家好,我是Python进阶者。一、前言前几天在Python钻石交流群【梦】问了一个Python网络爬虫的问题,这个网站不知道使用了什么反爬手段,都获取不到页面数据。原来的那篇文章竟然爆文了,突破了1.5w的阅读量,欢迎大家围观。不过这里粉丝的需求有点奇怪
liam liam
11个月前
掌握 XML HttpRequest 的关键要点
技术是构建动态、响应式网站的关键。这项技术使得网页能在不重新加载整个页面的情况下与服务器进行数据交互,极大地优化了用户的交互体验。定义XMLHttpRequestXMLHttpRequest是一种浏览器与服务器进行数据交换的API。尽管它的名字包含“XML
小白学大数据
小白学大数据
Lv1
男 · 亿牛云 · python技术
宁为代码类弯腰,不为bug点提交!
文章
106
粉丝
5
获赞
18