使用BeautifulSoup抓取Google Arts & Culture内容返回空列表问题求解
问题根因
你使用requests.get拿到的是页面初始静态源码,Google Arts & Culture的艺术家列表内容是JavaScript动态渲染生成的,Chrome开发者工具中看到的DOM结构是浏览器执行完JS逻辑后生成的结果,直接解析静态源码自然无法匹配到目标元素。
可行解决方案
推荐使用模拟浏览器的工具执行页面渲染JS后再提取内容,以Selenium为例:
- 前置依赖安装:
pip install selenium - 示例代码:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time # 配置无头模式,不弹出浏览器窗口 chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") # 配置UA避免被识别为爬虫 chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) url = 'https://artsandculture.google.com/category/artist?tab=time&date=1850' driver.get(url) # 等待JS渲染完成,可根据自身网络情况调整等待时长 time.sleep(3) # 获取渲染完成的完整页面源码 page_source = driver.page_source driver.quit() soup = BeautifulSoup(page_source, 'html.parser') # 正常匹配目标元素 target_links = [] for a_tag in soup.find_all('a', class_='e0WtYb HpzMff PJLMUc', href=True): target_links.append(a_tag['href']) print(a_tag['href'])
补充说明
如果需要获取全量数据,可添加页面滚动逻辑触发更多内容加载;也可将固定sleep替换为Selenium的显式等待WebDriverWait,避免等待时长不够导致元素加载不全的问题。
如果追求更高的爬取效率,可通过Chrome开发者工具的网络面板抓包找到返回艺术家列表的接口,直接请求接口获取JSON格式数据,该方案需要分析接口的请求参数规则,实现成本略高。
内容的提问来源于stack exchange,提问作者Jiho Choi
相关产品推荐
相关产品推荐

