使用urllib做webscraping无法获取站点姓名信息?如何获取地图顾问数据?
问题原因
- 核心原因是目标站点的顾问信息属于客户端动态渲染内容:你用urllib直接请求拿到的仅为页面初始静态HTML骨架,顾问数据是浏览器加载完初始页面后,异步调用后端接口获取、再动态插入到页面中的,初始HTML本身不存在这些信息。
- 额外可能的原因:urllib默认发送的请求无正常浏览器的请求头标识,很容易被站点的反爬机制识别为爬虫,返回无有效数据的拦截响应。
可行获取方案
方案1:抓取数据接口(效率最高)
打开浏览器开发者工具的「网络」面板,刷新页面后筛选Fetch/XHR类型的请求,找到返回顾问数据的后端接口,确认接口的请求参数、请求头要求后,直接构造符合要求的请求调用该接口,即可直接拿到结构化的JSON格式顾问数据,无需解析HTML。
注意构造请求时需要补全User-Agent、Referer等请求头字段,模拟正常浏览器请求避免被拦截。
方案2:使用无头浏览器渲染动态内容
如果接口参数加密、分析成本高,可以使用Selenium、Playwright等支持浏览器自动化的工具,启动无头模式加载完整页面,等动态内容全部渲染完成后再提取数据,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By chrome_options = Options() # 启用无头模式,不弹出浏览器窗口 chrome_options.add_argument("--headless=new") # 替换为正常浏览器的User-Agent,避免被识别为爬虫 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.iadfrance.fr/trouver-un-conseiller") # 等待顾问列表节点加载完成,比固定sleep更高效 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "advisor-card")) # 实际使用时替换为站点对应的顾问卡片类名 ) full_page_content = driver.page_source with open("demofile2.txt", "w", encoding="utf-8") as f: f.write(full_page_content) finally: driver.quit()
注意:爬取数据时请遵守目标站点的robots协议,控制请求频率,避免对站点服务造成不必要的压力。
内容的提问来源于stack exchange,提问作者pgmendormi
相关产品推荐
相关产品推荐

