如何从网页抓取动态加载的店铺URL
解决maroof.sa店铺URL抓取问题
核心问题排查
- Requests+BeautifulSoup失效:页面店铺数据由JavaScript动态渲染,直接请求获取的原始HTML不包含加载后的店铺链接
- Selenium未成功:大概率是元素选择器错误、等待策略不合理,或是网站存在基础反爬检测(比如识别自动化工具特征)
可行解决方案
1. 精准定位店铺链接元素
手动查看页面DOM结构后,店铺链接通常是带有/business/前缀的a标签,可通过CSS选择器a[href^='/business/']直接定位。
2. 优化Selenium抓取逻辑
通过配置浏览器选项规避反爬,配合显式等待确保元素加载完成:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options # 配置浏览器,模拟真实用户行为 chrome_options = Options() chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) driver.get("https://maroof.sa/businesses") try: # 显式等待,直到至少一个店铺链接加载完成 wait = WebDriverWait(driver, 20) shop_links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[href^='/business/']"))) # 提取URL并去重 url_list = list(set([link.get_attribute("href") for link in shop_links])) # 输出结果 for url in url_list: print(url) finally: driver.quit()
3. 处理滚动加载的分页内容
若页面需滚动加载更多店铺,可添加滚动逻辑:
# 在上述代码的try块中,添加滚动逻辑 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动至页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载 driver.implicitly_wait(5) # 判断是否加载完毕 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 重新提取所有链接 shop_links = driver.find_elements(By.CSS_SELECTOR, "a[href^='/business/']") url_list = list(set([link.get_attribute("href") for link in shop_links]))
4. 高效备选:直接调用API接口
通过浏览器开发者工具的「网络」面板,查找网站加载店铺数据的API接口(通常是包含businesses的XHR请求),直接用Requests请求接口获取JSON数据,解析后提取店铺URL,这种方式比Selenium更高效。
注意事项
- 控制请求频率,避免触发反爬机制,建议添加请求间隔
- 遵守网站
robots.txt规则(可访问https://maroof.sa/robots.txt查看)
内容的提问来源于stack exchange,提问作者ahmed sayed
相关产品推荐
相关产品推荐

