You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3用Requests爬取页面源代码 切换站点后正则匹配失效求助

问题原因

  • 页面渲染逻辑差异:autotrader.ca的手机号直接内嵌在静态HTML源码中,直接请求就能拿到对应字符串;kijijiautos.ca的手机号是前端JavaScript动态加载的,requests默认只获取未执行JS的初始静态源码,根本不存在你要匹配的手机号字段。
  • 匹配规则不适用:你假设目标站点的手机号字段名是"number",实际该站点的手机号字段命名、存储结构和你写的正则完全不匹配,就算数据存在也抓不到。
  • 代码逻辑漏洞:for循环中每次遍历都会覆盖number变量,最终只会输出最后一个URL的匹配结果,前面的结果都会被丢弃。

修复方案

方案1:抓对应接口直接请求(效率更高)

该站点的车辆详情页手机号会通过独立的接口返回,你可以在浏览器F12开发者工具的「网络」面板筛选XHR请求,找到对应手机号接口直接调用即可,示例代码如下:

import requests

headers = {
    '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',
    'Referer': 'https://www.kijijiautos.ca/'
}
# 接口参数中的id对应车辆详情页url里的数字编号
for car_id in ["22686710", "22686710"]:
    # 替换为你抓到的实际接口地址和参数
    api_url = f"https://www.kijijiautos.ca/api/v1/vehicles/{car_id}/contact"
    resp = requests.get(api_url, headers=headers)
    data = resp.json()
    # 按实际返回的字段名取手机号
    print(data.get("phone", {}).get("number"))

方案2:使用无头浏览器渲染页面(适配性更强)

如果不想抓接口,可以用Selenium、Playwright等工具模拟浏览器加载页面,等JS执行完成后再提取数据,示例用Playwright:

from playwright.sync_api import sync_playwright
import re

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/118.0.0.0 Safari/537.36')
    urls = ["https://www.kijijiautos.ca/vip/22686710/", "https://www.kijijiautos.ca/vip/22686710/"]
    for url in urls:
        page.goto(url)
        # 等待手机号元素加载完成
        page.wait_for_selector('[data-testid="seller-phone"]')
        # 直接提取元素文本或者用正则匹配页面渲染后的源码
        phone = page.locator('[data-testid="seller-phone"]').text_content()
        print(phone)
    browser.close()

内容的提问来源于stack exchange,提问作者Alian Nadeem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:06:02