Python动态网页爬取问题:如何直接获取阿根廷文化局博物馆联系方式
解决动态渲染页面的爬取问题
方法一:直接调用后端API(最简便)
很多动态渲染的网站,实际是通过AJAX请求后端API获取数据再渲染到页面上,这种方式比爬取渲染后的页面效率高得多:
- 打开目标页面,按F12打开浏览器开发者工具,切换到「Network」标签页,勾选「XHR」或「Fetch」选项
- 刷新页面,观察加载的请求,找到返回博物馆列表数据的JSON格式接口
- 找到接口后,直接用
requests请求这个接口,就能拿到包含电话、邮箱的结构化数据,不用解析HTML
举个示例(假设找到的API接口结构如下):
import requests api_url = 'https://rma.cultura.gob.ar/api/museos' params = {'provincias': 'Buenos Aires'} response = requests.get(api_url, params=params) data = response.json() # 遍历数据提取信息 for museo in data: print('电话:', museo.get('telefono')) print('邮箱:', museo.get('email'))
方法二:用浏览器自动化工具渲染页面
如果找不到API,就用Selenium模拟浏览器加载页面,等待JS渲染完成后再获取源码:
- 先安装依赖:
pip install selenium
- 下载对应浏览器的驱动(比如Chrome的ChromeDriver,需和浏览器版本匹配),放到Python可执行路径或指定路径
- 编写代码:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import time # 初始化Chrome浏览器驱动 driver = webdriver.Chrome() driver.get('https://rma.cultura.gob.ar/#/app/museos/resultados?provincias=Buenos%20Aires') # 等待页面核心元素加载完成(可根据实际页面元素调整) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'museo-item')) ) except: pass # 额外等待2秒确保所有内容渲染完毕 time.sleep(2) # 获取渲染后的完整页面源码 source = driver.page_source soup = BeautifulSoup(source, 'lxml') # 提取电话和邮箱(示例,需根据实际页面标签调整) telefonos = soup.find_all(class_='telefono') emails = soup.find_all(class_='email') for tel in telefonos: print(tel.text.strip()) for email in emails: print(email.text.strip()) # 关闭浏览器 driver.quit()
两种方法里,优先找API,速度快且稳定;实在找不到再用Selenium,缺点是速度较慢,还需额外配置驱动。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

