有些 Javascript 生成的动态内容,没有办法通过网页源代码查看。因为解析出的网页内容只是静态页面,不包含动态元素。
目前最新的前端技术比如服务器端渲染(SSR)、单页面应用(SPA)等,都是看不到静态的网页源码的。这种网页只能通过访问网站,使用浏览器开发者工具即时查看显示的元素。
Python可以使用Selenium模拟浏览器行为加载页面,就可以获得网页的实际显示元素。
下载浏览器驱动
搜索浏览器名字 + webdriver ,是一个单文件程序。下载后扔到C:\Users\user\AppData\Local\Programs\Python\Python311\Scripts,这是python安装路径下的script文件夹。放到这里面,python解释器能够识别,就不需要手动写路径了。
我有两个webdriver,geckodirver是firefox的驱动,一个是chromedriver。
演示程序
from selenium import webdriver
from bs4 import BeautifulSoup
import time
# 设置Selenium的WebDriver(例如Chrome)
driver = webdriver.Chrome()
# 打开目标网页
driver.get('https://blog.ingke.net')
# 等待页面加载完成
time.sleep(5) # 可以根据需要调整等待时间
# 获取页面源代码
page_source = driver.page_source
# 使用BeautifulSoup解析页面
soup = BeautifulSoup(page_source, 'html.parser')
# 提取你需要的信息
# 例如:soup.find_all('a')
# 关闭浏览器
driver.quit()
这回打开我的博客首页,然后打开一个浏览器页面,并打印所有的链接标签,最后关闭浏览器。
下载脚本
我要从一个民间的邦多利wiki上下载游戏解包后的文件。查看源代码只有一堆样式表,看不到任何网页结构。
使用Selenium + BeautifulSoup 解析网页。获取所有文件的url,加上网站的域名,拼接成完整的下载地址。然后将所有地址的文件下载保存到本地。
下载代码由Deepseek AI生成,我不太会用BeautifulSoup筛选元素。
import os
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import time
# 设置Selenium的WebDriver(例如Chrome)
driver = webdriver.Firefox()
# 打开目标网页
driver.get('https://bestdori.com/tool/explorer/asset/jp/live2d/chara/040_general')
# 等待页面加载完成
time.sleep(5) # 可以根据需要调整等待时间
# 获取页面源代码
page_source = driver.page_source
# 使用 BeautifulSoup 解析页面
soup = BeautifulSoup(page_source, 'html.parser')
# 查找所有 class 为 "is-inline-block m-lr-xs m-b-s" 的 div
target_divs = soup.find_all('div', class_='is-inline-block m-lr-xs m-b-s')
# 提取这些 div 内的所有 标签的 href 属性
hrefs = []
for div in target_divs:
a_tags = div.find_all('a')
for a in a_tags:
href = a.get('href')
if href: # 确保 href 存在
hrefs.append(href)
# 拼接完整链接并下载文件
base_url = 'https://bestdori.com' # 基础 URL
download_folder = 'downloads' # 下载文件保存的文件夹
# 创建下载文件夹(如果不存在)
if not os.path.exists(download_folder):
os.makedirs(download_folder)
# 下载文件
for href in hrefs:
# 拼接完整链接
full_url = base_url + href
# 获取文件名(从链接中提取最后一部分作为文件名)
file_name = href.split('/')[-1]
file_path = os.path.join(download_folder, file_name)
# 发送 HTTP 请求下载文件
try:
print(f'正在下载: {full_url}')
response = requests.get(full_url, stream=True)
response.raise_for_status() # 检查请求是否成功
# 保存文件
with open(file_path, 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)
print(f'文件已保存: {file_path}')
except Exception as e:
print(f'下载失败: {full_url}, 错误: {e}')
文章评论