使用XPath提取talosintelligence网站IP位置数据返回空列表如何解决
问题原因
你返回空列表的核心原因是Talos Intelligence的IP查询结果是前端JavaScript异步加载渲染的,你用requests直接请求拿到的只是页面初始骨架HTML,里面根本不存在id="location-data-wrapper"的DOM节点,自然匹配不到任何内容。你可以自行打印page.text搜索对应节点关键词验证,初始返回内容里完全没有位置相关的渲染结果。
解决方法
方法1:直接调用后端数据接口(推荐,性能高无额外浏览器依赖)
Talos前端渲染用的位置数据是从固定接口拉取的,你可以直接构造请求调用接口拿结构化数据,不需要解析HTML:
import requests ip = "198.86.225.18" # 必须带合法请求头,否则会被反爬拦截 headers = { "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", "Referer": f"https://talosintelligence.com/reputation_center/lookup?search={ip}" } resp = requests.get( f"https://talosintelligence.com/api/v2/reputation/ip/{ip}", headers=headers ) data = resp.json() # 从结构化返回值中提取位置字段 location = f"{data['location']['city']}, {data['location']['country']}" print(location)
运行后即可输出预期结果Charlotte, United States。
方法2:使用无头浏览器渲染页面后解析
如果你需要直接解析渲染完成的前端DOM,可以用无头浏览器工具模拟真实用户加载完所有JS资源后再提取元素,该方法性能较低,需要额外安装浏览器依赖:
# 前置依赖安装:pip install playwright && playwright install chromium from playwright.sync_api import sync_playwright from lxml import html ip = "198.86.225.18" with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(f"https://talosintelligence.com/reputation_center/lookup?search={ip}") # 等待位置模块加载完成再取页面内容 page.wait_for_selector("#location-data-wrapper td") tree = html.fromstring(page.content()) talosiploc = tree.xpath('//*[@id="location-data-wrapper"]/table/tr/td/text()') # 过滤空白字符后拼接位置 talosiploc = [i.strip() for i in talosiploc if i.strip()] print(f"{talosiploc[0]}, {talosiploc[-1]}") browser.close()
注意:请求时请控制访问频率,使用真实浏览器特征的请求头,避免被站点反爬策略封禁。
内容的提问来源于stack exchange,提问作者pynoob
相关产品推荐
相关产品推荐

