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
相关产品推荐
相关产品推荐

