使用requests模块无法抓取目标网站啤酒厂名称的问题求助
问题原因及解决方案
你的脚本没获取到结果,核心原因是目标网站的啤酒厂列表是动态加载的:用requests拿到的只是服务器返回的初始静态HTML,而页面上的啤酒厂内容是浏览器执行JavaScript后才渲染出来的,初始HTML里根本没有你要定位的.company-content > h3[itemprop='name']元素,所以BeautifulSoup找不到任何内容。
下面提供两种可行的解决方法:
方法1:用Selenium模拟浏览器加载动态内容
Selenium可以模拟真实浏览器的行为,等待页面JavaScript执行完成后再抓取内容:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time # 配置Chrome无头模式(不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36') # 启动浏览器并访问目标页面 driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.brewersassociation.org/directories/breweries/") # 等待页面渲染完成(可根据实际情况调整等待时间) time.sleep(3) # 如果需要加载更多内容,可以模拟滚动到底部 # for _ in range(3): # driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # time.sleep(2) # 定位并打印啤酒厂名称 brewery_names = driver.find_elements(By.CSS_SELECTOR, ".company-content > h3[itemprop='name']") for name in brewery_names: print(name.text) # 关闭浏览器 driver.quit()
方法2:直接调用动态加载的API接口
打开浏览器开发者工具的「Network」标签,刷新页面后过滤XHR请求,能找到网站用来加载啤酒厂数据的API接口。直接请求这个接口可以拿到结构化的JSON数据,不需要解析HTML:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'Accept': 'application/json' } # 实际API地址需从开发者工具抓包获取,以下为示例格式 api_url = "https://www.brewersassociation.org/wp-json/ba/v1/breweries?per_page=20&page=1" response = requests.get(api_url, headers=headers) data = response.json() # 遍历打印啤酒厂名称 for brewery in data: print(brewery['name'])
内容的提问来源于stack exchange,提问作者MITHU
相关产品推荐
相关产品推荐

