Python爬取JS渲染、源码不含目标内容的网站数据方案
针对JS渲染站点的企业信息爬取落地方案
优先方案:直接调用站点后端接口(无浏览器依赖,效率最高)
这类靠JS渲染内容的站点,本质是页面加载后主动请求后端接口拿数据再渲染到页面上,完全不需要模拟浏览器操作:
- 打开任意目标页面按F12调出开发者工具,切换到网络面板,筛选XHR类型请求后刷新页面,就能找到返回企业结构化数据的接口,这类接口一般直接返回JSON格式数据,不需要做HTML解析
- 从你已有的链接集合里提取每个公告的唯一ID,拼接成接口请求路径,用
requests库批量发请求即可,请求时带上常规的浏览器User-Agent头就能正常拿到返回结果,没有复杂鉴权限制 - 直接从返回的JSON里匹配
orgnr、företagsnamn、säte对应的字段值,按你需要的列表结构拼接存储就行,单请求耗时不到1秒,批量爬取的效率是模拟浏览器方案的10倍以上,也完全不会遇到浏览器启动失败的问题
备选方案:换用自动驱动管理的无头浏览器方案
如果不想做接口逆向,直接换掉你之前的Firefox+手动配驱动的Selenium组合,从根源解决启动失败问题:
- 首推Playwright库,安装时会自动匹配下载对应版本的浏览器内核和驱动,不需要手动找资源、配环境变量,从根本上避免驱动和浏览器版本不匹配导致的启动失败
安装直接执行两行命令:
核心爬取逻辑参考:pip install playwright playwright install chromiumfrom playwright.sync_api import sync_playwright import json import time import random # 你的链接集合 target_links = ["链接1", "链接2", "链接3"] result = [] with sync_playwright() as p: # 无头模式启动,不会弹出浏览器窗口 browser = p.chromium.launch(headless=True) page = browser.new_page(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") for url in target_links: page.goto(url, wait_until="domcontentloaded") # 等待企业信息块加载完成,超时时间设10秒 page.wait_for_selector(".company-info-panel", timeout=10000) # 按页面实际选择器提取对应字段 item = { "orgnr": page.locator("xpath=//*[contains(text(),'Organisationsnummer')]/following-sibling::span").inner_text().strip(), "företagsnamn": page.locator("xpath=//*[contains(text(),'Företagsnamn')]/following-sibling::span").inner_text().strip(), "säte": page.locator("xpath=//*[contains(text(),'Säte')]/following-sibling::span").inner_text().strip() } result.append(item) # 随机间隔1-2秒,避免触发反爬 time.sleep(random.uniform(1,2)) browser.close() # 结果存为本地JSON文件 with open("company_data.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2) - 如果坚持用Selenium,不要手动配Firefox驱动,直接换Chrome组合,用
webdriver-manager自动管理驱动版本,安装命令pip install selenium webdriver-manager,启动代码如下,不会出现启动失败问题:from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
注意:爬取过程中控制请求频率,不要短时间发大量请求,避免被站点限制访问。
内容的提问来源于stack exchange,提问作者Antonios
相关产品推荐
相关产品推荐

